Dagger 2注射返回null

时间:2015-08-13 20:02:19

标签: java android dagger-2

所以这是我的申请文件

private AppComponent component;

@Override
public void onCreate() {
    super.onCreate();
    setupGraph();
}

private void setupGraph() {
    component = DaggerAppComponent.builder()
            .appModule(new AppModule(this))
            .build();
    component.inject(this);
}

public AppComponent component() {
    return component;
}

应用程序组件:

@Singleton
@Component(
    modules = {
        AppModule.class
    }
)
public interface AppComponent {
    void inject(BaseActivity activity);

    void inject(BaseFragment fragment);
}

ActivityModule:

@Module public final class ActivityModule {

private final Activity activity;

public ActivityModule(Activity activity) {
    this.activity = activity;
}

@Provides @ActivityContext
public Context provideActivityContext() {
    return activity;
}

/**
 * Expose the activity to dependents in the graph.
 */
@Provides @PerActivity
Activity activity() {
    return this.activity;
}

@Provides @GetFragmentManager
public FragmentManager provideFragmentManager() {
    return ((BaseActivity)activity).getSupportFragmentManager();
}

活动组件:

@PerActivity
@Component(dependencies = AppComponent.class, modules = {ActivityModule.class, PresenterModule.class})
public interface ActivityComponent {
    //Exposed to sub-graphs.
    Activity activity();
}

我正在使用像我这样的BaseActivity注入

((MyApplication) getApplication()).component().inject(this)

不确定此注入是否正确但我没有编译错误。

现在,当我试图访问我的片段中的presenter时出现问题,因为它是null。我正在定义我的演示者模块如下

演示者模块: 1.第一次尝试

@Module
public class PresenterModule {

    @Provides @PerActivity
    public Presenter accessPresenter(MyPresenter presenter){
        return presenter;
    }
}
  1. 第二次尝试

    @Module 公共类PresenterModule {

    @Provides @PerActivity
    public Presenter accessPresenter(){
        return new MyPresenter();
    }
    

    }

  2. 在我的片段中,我正在做

    @Inject MyPresenter presenter;
    

    在我的onViewCreated上我试图将视图设置为

    presenter.setView(this); // This is null
    

    MyPresenter与此EffectiveAndroidUI类似,唯一的区别是我的构造函数中没有任何内容。

3 个答案:

答案 0 :(得分:4)

听起来你并没有注射你的碎片。当您使用@Inject注释成员时,您还必须调用yourObjectGraph.inject(this),其中注入方法的签名如下:

void inject(YourFragmentClass fragment);

您可以通过两种方式将演示者带到片段中。将上面的方法添加到您的应用程序组件中,并在onCreate()函数中调用它。或者只是在创建演示者时将片段传递给演示者。 例如:

YourFragmentClass newInstance(Bundle savedInstance, YourPresenter presenter) {
     ...
}

答案 1 :(得分:0)

您需要像界面一样引用您的演示者:

@ActivityScope @Component(dependencies = ApplicationComponent.class,
modules = { GenreModule.class })
public interface GenreFragmentComponent {
  void inject(GenreFragment genreFragment);
  GenrePresenter getPresenter(); // Like this
}

此处的完整示例:https://github.com/ppamorim/Amazing-MVP

答案 2 :(得分:0)

在我的情况下,我将一个类注入一个片段而不是它的演示者,然后纠正它。