令人困惑的是,所有网络搜索结果似乎都使用略有不同版本的Dagger或不同的方法。我遵循的例子声称这是更好的“新方式”。 (https://proandroiddev.com/exploring-the-new-dagger-android-module-9eb6075f1a46)完整的示例源代码在此处(https://github.com/jshvarts/DaggerAndroidKotlinSampleApp)。
现在,我想知道如何为Context提供非活动/片段类。所以,我添加了一个这样的简单类,
class Sample2 @Inject constructor (var app: Application)
{
fun print()
{
Log.d("sample2", app.packageName);
}
}
但即使示例项目有AppModule和AppComponent,编译也会失败,因为无法提供app。
我在网上搜索过并发现了这种方法(https://github.com/google/dagger/issues/832)。我按照那个代码修改了样本的AppModule和AppComponent,就像这样,
@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.java:7:错误:@Module可能不包含非静态@Provides方法和抽象@Binds或@Multibinds声明 公共抽象类AppModule {
同样,正如我在开始时所说的,互联网上的Dagger示例都略有不同,我不知道如何从两个示例中获取两个特征。
答案 0 :(得分:1)
最好将@Binds和@Provides分开,你可以创建一个组件类:
@Singleton
@Component(
modules = [(AppModule::class)]
)
interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
fun application(app: Application): Builder
fun build(): AppComponent
}
}
然后是所有@Provides
的AppModule类@Module
class AppModule() {
@Singleton
@Provides
fun providesCommonHelloService() = CommonHelloService()
}