首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dagger 2注入注释中断注入

Dagger 2注入注释中断注入
EN

Stack Overflow用户
提问于 2016-08-02 16:33:11
回答 3查看 640关注 0票数 2

我使用匕首2将FragmentManager和FragmentTransaction注入到我的活动中。我补充说,一切看起来都很好。

代码语言:javascript
复制
@Inject
FragmentManager fragmentManager;

@Inject
FragmentTransaction fragmentTransaction

在我的活动中抛出一个关于重建的错误,如下所示:

错误:(21,10)错误:如果没有@ provided或@Produces-带注释的方法,就不能提供android.support.v4.app.FragmentManager。com.toranj.tyke.ui.MainActivity.fragmentManager注射了android.support.v4.app.FragmentManager,com.toranj.tyke.dagger.components.LotteryComponent.inject(activity)注射了com.toranj.tyke.ui.MainActivity

下面是模块

代码语言:javascript
复制
@Module
public class FragmentModule {

    FragmentActivity activity;

    public FragmentModule(FragmentActivity activity) {
        this.activity = activity;
    }

    @Provides
    @PerActivity
    public FragmentManager providesFragmentManager() {
        return activity.getSupportFragmentManager();
    }

    @Provides
    @PerActivity
    public FragmentTransaction providesFragmentTransaction() {
        return activity.getSupportFragmentManager().beginTransaction();
    }
}

下面是组件

代码语言:javascript
复制
@PerActivity
@Component(modules = FragmentModule.class)
public interface FragmentComponent {
    void inject(Activity activity);

    FragmentManager fragmentManager();
    FragmentTransaction fragmentTransaction();
}

下面是我的活动:

代码语言:javascript
复制
public class MainActivity extends AppCompatActivity {

    @Inject
    FragmentManager fragmentManager;

    @Inject
    FragmentTransaction fragmentTransaction;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        FragmentComponent fragmentComponent = DaggerFragmentComponent.builder()
                .fragmentModule(new FragmentModule(this))
                .build();
        fragmentComponent.inject(this);
    }
}

我对使用匕首和依赖注入非常陌生,而且我可能忽略了其中的一点。任何有解释的回答都将帮助我理解注入,也是非常感谢的。

android.support.v4.app.FragmentManager.编辑:模块、组件和活动中使用的所有fragmentManagers都来自

EN

回答 3

Stack Overflow用户

发布于 2016-08-02 16:49:13

我想android.app.FragmentManager是在FragmentComponent中使用的。

应该使用android.support.v4.app.FragmentManager

票数 1
EN

Stack Overflow用户

发布于 2016-08-03 03:59:57

从错误中我可以看到,您似乎正在使用另一个组件注入活动:LotteryComponent.java

另外,请尝试更改此方法。

代码语言:javascript
复制
@Provides
@PerActivity
public FragmentTransaction providesFragmentTransaction() {
    return activity.getSupportFragmentManager().beginTransaction();
}

代码语言:javascript
复制
@Provides
@PerActivity
public FragmentTransaction providesFragmentTransaction(FragmentManager fm) {
    return fm.beginTransaction();
}

我怀疑这将解决问题,但值得一试,至少您将从相同的源中始终检索对象。

票数 0
EN

Stack Overflow用户

发布于 2016-08-03 07:24:34

您应该注入实际要使用的类。

代码语言:javascript
复制
public interface FragmentComponent {
    void inject(Activity activity);
}

这将注入Activity,这是Android的一部分,没有任何@Inject注释字段。这个注入方法基本上是没有操作的。

Dagger在编译时生成依赖关系图。它不知道您突然尝试注入MainActivity并期望FragmentManager出现。

tl;dr

提供

代码语言:javascript
复制
public interface FragmentComponent {
    void inject(MainActivity activity);
}

而且它应该能工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38725983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档