【问题标题】:How to inject idemId to presenter with Dagger 2? dagger.android如何使用 Dagger 2 将 idemId 注入演示者?匕首.android
【发布时间】:2017-11-29 02:35:00
【问题描述】:

我想将点击的项目 ID 直接传递给详细演示者。我的详细活动有一个公共财产,因此我尝试将其提供给我的演示者。

这是我的代码;

@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 不能在没有@Inject 构造函数或@Provides-annotated 方法的情况下提供。此类型支持成员注入,但不能隐式提供。

【问题讨论】:

    标签: java android dagger-2 dagger


    【解决方案1】:

    您必须首先提供您的MovieDetailActivity,因此将MovieDetailActivity 传递给MovieDetailActivityModule 构造函数并在您的模块中提供活动,例如:

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

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

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

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

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

    【讨论】:

    • 我使用的是 2.11 版本的 dagger.android,所以正如您所说,将活动传递给模块并不是一件好事。我添加了范围注释,非常感谢。但是,将唯一与演示者相关的项目传递给演示者的最佳做法是什么?我不想将项目 ID 传递给片段(视图),然后从片段中调用演示者的方法。我应该如何将item id直接注入presenter?
    • @EfeBudak 您是否只需要将movieId 传递给您的演示者?
    • 我需要传递它来从远程数据源获取数据。
    • @EfeBudak 创建组件时,只将movieId 传递给您的模块很容易。例如myComponentBuilder.module(new MovieDetailActivityModule(movieId)) 那么你就可以访问你的MovieDetailActivityModule中的电影ID了
    • 我没有在 dagger 2.11 上创建我的组件。 google.github.io/dagger//android.html 。所以它不适用于那种情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-04
    相关资源
    最近更新 更多