Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 匕首2注射返回空_Java_Android_Dagger 2 - Fatal编程技术网

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;
    }
}
  • 第二次尝试

    @模块 公共类PresenterModule{

    @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组件将为空。