所以这是我的申请文件
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;
}
}
第二次尝试
@Module 公共类PresenterModule {
@Provides @PerActivity
public Presenter accessPresenter(){
return new MyPresenter();
}
}
在我的片段中,我正在做
@Inject MyPresenter presenter;
在我的onViewCreated上我试图将视图设置为
presenter.setView(this); // This is null
MyPresenter与此EffectiveAndroidUI类似,唯一的区别是我的构造函数中没有任何内容。
答案 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
}
答案 2 :(得分:0)
在我的情况下,我将一个类注入一个片段而不是它的演示者,然后纠正它。