Dagger 2 注入返回 null

Dagger 2 injection returning null

这是我的申请文件

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);
}

Activity模块:

@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();
}

Activity 分量:

@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)

不确定此注入是否正确,但我没有遇到任何编译错误。

现在,当我尝试访问片段中的演示者时出现问题,因为它为空。我正在按如下方式定义我的演示器模块

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

@Module
public class PresenterModule {

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

    @模块 public class PresenterModule {

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

    }

在我的片段中我正在做

@Inject MyPresenter presenter;

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

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

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

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

@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

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

void inject(YourFragmentClass fragment);

您有两种选择可以让演示者看到您的片段。将上面的这个方法添加到您的应用程序组件,并在您的 onCreate() 函数中调用它。或者在创建片段时将片段传递给演示者。 例如:

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

在我的例子中,我将 class 注入了一个片段而不是它的演示者,然后更正了它。