“dagger android”库,如何提供上下文(应用程序)?
令人困惑的是,所有的网络搜索结果似乎都使用了略微不同的Dagger版本或不同的方法。我遵循的例子声称这是更好的新方法。完整的示例源代码在这里 现在,我想知道如何为非活动/片段类提供上下文。所以,我添加了这样一个简单的类“dagger android”库,如何提供上下文(应用程序)?,android,kotlin,dagger,Android,Kotlin,Dagger,令人困惑的是,所有的网络搜索结果似乎都使用了略微不同的Dagger版本或不同的方法。我遵循的例子声称这是更好的新方法。完整的示例源代码在这里 现在,我想知道如何为非活动/片段类提供上下文。所以,我添加了这样一个简单的类 class Sample2 @Inject constructor (var app: Application) { fun print() { Log.d("sample2", app.packageName); } } @Module
class Sample2 @Inject constructor (var app: Application)
{
fun print()
{
Log.d("sample2", app.packageName);
}
}
@Module(includes = [AndroidInjectionModule::class])
abstract class AppModule {
@Binds
abstract fun application(app: App):Application;
@Singleton
@Provides
fun providesCommonHelloService() = CommonHelloService()
}
@Singleton
@Component(modules = [AndroidInjectionModule::class,
AppModule::class, ActivitiesModule::class])
interface AppComponent:AndroidInjector<App>
{
@Component.Builder
abstract class Builder:AndroidInjector.Builder<App>(){}
}
class App : Application(), HasActivityInjector {
@Inject
lateinit var activityInjector: DispatchingAndroidInjector<Activity>
override fun onCreate()
{
super.onCreate()
DaggerAppComponent.builder().create(this).inject(this)
}
override fun activityInjector(): AndroidInjector<Activity> = activityInjector
}
但是,即使示例项目有AppModule和AppComponent,编译还是失败了,因为无法提供AppModule和AppComponent
我在网上搜索了一下,找到了这个方法。我按照代码修改了示例的AppModule和AppComponent,如下所示
class Sample2 @Inject constructor (var app: Application)
{
fun print()
{
Log.d("sample2", app.packageName);
}
}
@Module(includes = [AndroidInjectionModule::class])
abstract class AppModule {
@Binds
abstract fun application(app: App):Application;
@Singleton
@Provides
fun providesCommonHelloService() = CommonHelloService()
}
@Singleton
@Component(modules = [AndroidInjectionModule::class,
AppModule::class, ActivitiesModule::class])
interface AppComponent:AndroidInjector<App>
{
@Component.Builder
abstract class Builder:AndroidInjector.Builder<App>(){}
}
class App : Application(), HasActivityInjector {
@Inject
lateinit var activityInjector: DispatchingAndroidInjector<Activity>
override fun onCreate()
{
super.onCreate()
DaggerAppComponent.builder().create(this).inject(this)
}
override fun activityInjector(): AndroidInjector<Activity> = activityInjector
}
但是,我得到以下编译错误
java:7:错误:@Module不能同时包含非静态@Provides方法和抽象@Binds或@Multibinds声明
公共抽象类AppModule{
同样,正如我在开始时所说,Internet上的Dagger示例都略有不同,我不知道如何从两个示例中提取两个功能。最好将@Binds和@Provides分开,您可以创建一个组件类:
@Singleton
@Component(
modules = [(AppModule::class)]
)
interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
fun application(app: Application): Builder
fun build(): AppComponent
}
}
然后为所有@提供一个AppModule类
@Module
class AppModule() {
@Singleton
@Provides
fun providesCommonHelloService() = CommonHelloService()
}
我正在打电话,或者我会提供一个正确的答案。因为我不能,请看这篇博客文章,它准确地描述了如何做你想做的事。完整披露:我写了这篇文章。