Java 匕首2注射返回空
这是我的申请文件Java 匕首2注射返回空,java,android,dagger-2,Java,Android,Dagger 2,这是我的申请文件 private AppComponent component; @Override public void onCreate() { super.onCreate(); setupGraph(); } private void setupGraph() { component = DaggerAppComponent.builder() .appModule(new AppModule(this)) .
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);
}
活动模块:
@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();
}
我像这样在我的基础活动中注射
((MyApplication) getApplication()).component().inject(this)
不确定这种注入是否正确,但我没有得到编译错误
现在,当我试图访问片段中的presenter时,问题来了,因为它是空的。我定义我的演示者模块如下
演示者模块:
1.第一次尝试
@Module
public class PresenterModule {
@Provides @PerActivity
public Presenter accessPresenter(MyPresenter presenter){
return presenter;
}
}
@Provides @PerActivity
public Presenter accessPresenter(){
return new MyPresenter();
}
}@Inject MyPresenter presenter;
在我的onViewCreated上,我试图将视图设置为
presenter.setView(this); // This is null
MyPresenter与此类似,唯一的区别是我的构造函数中没有任何内容。您需要像接口一样引用演示者:
@ActivityScope @Component(dependencies = ApplicationComponent.class,
modules = { GenreModule.class })
public interface GenreFragmentComponent {
void inject(GenreFragment genreFragment);
GenrePresenter getPresenter(); // Like this
}
此处的完整示例:您需要像界面一样引用演示者:
@ActivityScope @Component(dependencies = ApplicationComponent.class,
modules = { GenreModule.class })
public interface GenreFragmentComponent {
void inject(GenreFragment genreFragment);
GenrePresenter getPresenter(); // Like this
}
这里的完整示例:听起来好像您没有注入片段。使用
@Inject
注释成员时,还必须调用yourObjectGraph.Inject(this)
,其中Inject方法的签名如下:
void inject(YourFragmentClass fragment);
有两个选项可以让演示者访问片段。将上述方法添加到应用程序组件中,并在onCreate()函数中调用它。或者在创建片段时将其传递给演示者。
例:
听起来你没有注射你的碎片。使用
@Inject
注释成员时,还必须调用yourObjectGraph.Inject(this)
,其中Inject方法的签名如下:
void inject(YourFragmentClass fragment);
有两个选项可以让演示者访问片段。将上述方法添加到应用程序组件中,并在onCreate()函数中调用它。或者在创建片段时将其传递给演示者。
例:
在我的例子中,我将一个类注入一个片段,而不是它的演示者,然后更正它。在我的例子中,我将一个类注入一个片段,而不是它的演示者,然后更正它。为什么有必要将演示者作为接口?演示者不是作为接口,这是演示者的“参考”。否则:匕首1有点难理解。我建议你从匕首2开始。无反射,一个简单的预处理器。很多好处。为什么有必要将presenter作为界面?presenter不是作为界面,这是presenter的“参考”。否则:匕首1有点难理解。我建议你从匕首2开始。无反射,一个简单的预处理器。有很多好处。我认为这是Dagger1的一个要求。。因为dagger 2中不推荐使用对象图。不完全是这样,您可以调用在组件接口中定义的
inject(…)
方法来实现依赖关系。它本质上是创建一个对象图。唯一的区别是您在Dagger 2中定义了注入方法,而Dagger 1中已经定义了注入方法。只需将inject方法添加到应用程序组件中,您就可以对片段调用inject(…)
。baseFragment不会满足此要求吗。现在我正在注入我的BaseFragment,就像我的baseActivity((baseActivity)getActivity())一样;在类上调用inject(…)
时,Dagger只能注入类本身及其超类的成员。Dagger不知道要在派生类中注入的成员,因为基类也不知道。很有趣..谢谢,这很有效。。但是有没有更好的方法呢..就像我只注入我的基类,它也可以注入我的派生类.我想这是Dagger1的一个要求。。因为dagger 2中不推荐使用对象图。不完全是这样,您可以调用在组件接口中定义的inject(…)
方法来实现依赖关系。它本质上是创建一个对象图。唯一的区别是您在Dagger 2中定义了注入方法,而Dagger 1中已经定义了注入方法。只需将inject方法添加到应用程序组件中,您就可以对片段调用inject(…)
。baseFragment不会满足此要求吗。现在我正在注入我的BaseFragment,就像我的baseActivity((baseActivity)getActivity())一样;在类上调用inject(…)
时,Dagger只能注入类本身及其超类的成员。Dagger不知道要在派生类中注入的成员,因为基类也不知道。很有趣..谢谢,这很有效。。但是有没有更好的方法呢..就像我只注入我的基类,它也可以注入我的派生类一样。希望你在Android清单文件中添加了应用程序类名。如果没有它,应用程序将工作,但dagger组件将为空。希望您在Android清单文件中添加了应用程序类名。如果没有它,应用程序将工作,但dagger组件将为空。