java - 如何使用 Dagger 2 将 idemId 注入(inject)到 Presenter 中? Dagger .android

标签 java android dagger-2 dagger

我想将单击的项目 ID 直接传递给详细信息演示者。我的详细 Activity 有一个公共(public)属性(property),因此我尝试将其提供给我的演示者。

这是我的代码;

@Module
public class MovieDetailActivityModule {

   @Provides
   Long provideMovieId(MovieDetailActivity movieDetailActivity) {
       return movieDetailActivity.movieId;
   }
}

@Inject
MovieDetailPresenter(
        @NonNull MovieDetailContract.View view,
        @NonNull MovieRepository movieRepository,
        @NonNull Long movieId) {
    mView = view;
    mMovieRepository = movieRepository;
    mMovieId = movieId;
}

我收到以下错误,

MovieDetailActivity cannot be provided without an @Inject constructor or from an @Provides-annotated method.This type supports members injection but cannot be implicitly provided.

最佳答案

您必须首先提供 MovieDetailActivity,因此将 MovieDetailActivity 传递给 MovieDetailActivityModule 构造函数,并在模块中提供 Activity ,如下所示:

@Provides
@SomeScope
public  MovieDetailActivity activity(){
     return this.activity;
}

但请注意,将 Activity 传递给 dagger 的模块并不是一个好的模式。

此外,您还应该使用作用域机制,只要其作用域存在,它就会关心保留类的单个实例,您当前的代码似乎也会导致内存泄漏。

如果您使用新的 android-dagger 扩展,您可以在模块构建器中覆盖 seedInstance 来访问您的 Activity

@Subcomponent.Builder abstract class Builder extends AndroidInjector.Builder<YourActivity> {
    public abstract Builder yourModule(YourModule module);

    @Override public void seedInstance(YourActivity activity) {
      yourModule(new YourModule(activity.movieId));
    }
  }

关于java - 如何使用 Dagger 2 将 idemId 注入(inject)到 Presenter 中? Dagger .android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44756567/

相关文章:

android - 尝试使用 Dagger2 和 Kotlin 将 ViewModelProvider 注入(inject) Activity 时出错

android - 在 kotlin android 中显示 Unresolved 引用

android - 注入(inject)实例时将参数传递给提供者方法

java - 如何将 Waze 流量​​数据集成到网站中?

java - 从 Arduino 到处理的完整串行字符串

java - Gwt 重新加载被多次调用

java - 将系统应用程序的文件复制到另一个位置时出错

android - Chrome 手机 : URL bar causes trouble with footer

java - 如何在运行时在不同的上下文中引用 Spring bean

java 如何使用socket获得更快的速度