代码之家  ›  专栏  ›  技术社区  ›  j2emanue

Dagger2中@Binds和@Provides注释的用例是什么

  •  0
  • j2emanue  · 技术社区  · 6 年前

    @Bind annotation.

    从我在网上看到的情况来看,我仍然不清楚,但这里有一个例子:

    @Module
    public abstract class HomeModule {
    
      @Binds
      public abstract HomePresenter bindHomePresenter(HomePresenterImp   
        homePresenterImp);
    }
    

    类定义如下:

    public interface HomePresenter {
        Observable<List<User>> loadUsers();
    }
    
    public class HomePresenterImp implements HomePresenter {
    
        public HomePresenterImp(){
        }  
    
        @Override
        public Observable<List<User>> loadUsers(){
            //Return user list observable
        }
    }
    

    @Provides
    public HomePresenter provideHomePresenter() {
        return new HomePresenterImp();
    }
    

    @Binds而不是@Provides的用例是什么?如果我使用@Binds,我还需要在appcomponent中声明它吗(当我使用@Binds时,它是一个抽象类)?

    2 回复  |  直到 6 年前
        1
  •  41
  •   Jeff Bowman    6 年前

    @Provides
    public HomePresenter provideHomePresenter() {
        return new HomePresenterImp();
    }
    

    …尽管您可能更喜欢将HomePresenterImp作为方法参数的变体,它允许Dagger实例化HomePresenterImp(假设它有@Inject构造函数),包括传递它所需的任何依赖项。你也可以做这个 static

    @Provides
    public static HomePresenter provideHomePresenter(HomePresenterImp presenter) {
        return presenter;
    }
    

    那你为什么要选择 @Binds 相反呢? Dagger has a FAQ about it 但归根结底是因为以下原因:

    • @绑定(稍微)更紧凑:可以跳过实现。
    • @绑定在接口和抽象类中工作,这是像@BindsOptionalOf和@ContributesAndroidInjector这样的匕首特性的严格要求。
    • @绑定有助于代码保持高效@提供的方法可以是实例方法,需要Dagger实例化模块才能调用它们。制作你的@Provides方法 静止的 静止的 . @绑定方法不会。
    • @绑定可以防止Dagger必须使用codegen并为对象保留一个单独的工厂/提供者,因为Java不允许Dagger访问以知道实现是如此简单。在你的情况下,匕首可以 Provider<HomePresenterImp> Provider<HomePresenter> 只保留一个,而不是为HomePresenter保留一个,HomePresenter只调用HomePresenterImp的一个。

    因此,整个事件可以很好地表示为:

    @Binds abstract HomePresenter bindHomePresenter(HomePresenterImp presenter);
    
        2
  •  3
  •   Samuel Eminet    6 年前

    Bind 假设你有一个 BaseActivityModule 它包含在提供活动viewmodel的所有活动模块中。

    @Module
    object BaseActivityModule {
        @Provides
        @ActivityScope
        @ActivityContext
        @JvmStatic
        fun provideViewModelProvider(
            activity: AppCompatActivity,
            viewModelFactory: ViewModelProvider.Factory
        ): ViewModelProvider = ViewModelProviders.of(activity, viewModelFactory)
    }
    

    AppCompatActivity 和一个 ViewModelProvider.Factory AppCompative活动 Provide 因为活动是由android创建的。

    我们假设你的混凝土 ActivityModule 例如 MainActivityModule 将提供 MainActivity ContributesAndroidInjector 自动创建子组件(但这是另一个话题)。

    主活动模块 提供 我们的 主活动模块 包括我们的 需要一个 . 所以这里是 绑定 AppCompative活动 你可以用我们的 主要活动

    @Module(includes = [BaseActivityModule::class])
    abstract class MainActivityModule {
        @Binds
        @ActivityScope
        abstract fun bindActivity(activity: MainActivity): AppCompatActivity
    }
    

    您可以从我的项目模板中看到更多信息 here