0
点赞
收藏
分享

微信扫一扫

@BindsInstance在Dagger2中怎么使用


不使用 @BindsInstance

​@BindsInstance​​的使用是为了移除Module模块的有参构造函数。比如我们现在有一个依赖是Context,那么如何提供它呢?一种方法是通过一个module类的构造函数注入,并由module提供Context给其他module类使用:

@Module
class AppModule(val app: Application) {

@Provides
@Singleton
fun provideApplication(): Application = app

@Provides
@Singleton
fun provideSharedPreferences(app: Application): SharedPreferences = app.getSharedPreferences("Share", Context.MODE_PRIVATE)

}

@Singleton
@Component(modules = [AndroidInjectionModule::class,AppModule::class,ToastMakerModule::class,MainActivityModule::class])
interface AppComponent {

@Component.Builder
interface Builder {
// without @BindsInstance
fun appModule(appModule: AppModule):Builder

fun build():AppComponent

}

fun inject(app:StApplication)
}

= DaggerAppComponent
.builder()
.appModule(AppModule(this))
.build()

appComponent.inject(this)

使用@BindsInstance

使用@BindsInstance的目的就是不再通过一个module类的构造函数来注入依赖,直接在component初始化时提供,如:
首先移除module类的构造函数:

@Module
class AppModule {

@Provides
@Singleton
fun provideSharedPreferences(app: Application): SharedPreferences = app.getSharedPreferences("Share", Context.MODE_PRIVATE)

}

在Component里流入依赖:

@Singleton
@Component(modules = [AndroidInjectionModule::class,AppModule::class,ToastMakerModule::class,MainActivityModule::class])
interface AppComponent {

@Component.Builder
interface Builder {
// with @BindsInstance
@BindsInstance
fun provideContext(app: Application):Builder

fun build():AppComponent

}

fun inject(app:StApplication)
}

//        with @BindsInstance
appComponent = DaggerAppComponent
.builder()
.provideContext(this)
.build()

appComponent.inject(this)

参考例子:
​​​https://github.com/wongkyunban/MyDaggerDemo​​


举报

相关推荐

0 条评论