dagger2 里 如果@Model 注解的是抽象類(lèi)時(shí) @provides 標(biāo)注的必須是靜態(tài)方法
A @Module may not contain both non-static @Provides methods and abstract @Binds or @Multibinds declarations
java 方式這樣寫(xiě)沒(méi)有問(wèn)題 而我們知道Kotlin 是沒(méi)有static 標(biāo)記顯示是靜態(tài)方法 需要寫(xiě)companion object 來(lái)包含靜態(tài)成員
@Module
public abstract class ApplicationModule{
@Singleton
@Binds
abstract Context provdeeAppContext(Application application);
@Singleton
@Provides
public static String provideString(){
return "this is test";
}
}
Kotlin 包含靜態(tài)成員的 方式
@Module
abstract class ApplicationModule {
@Singleton
@Binds
abstract fun provdeeAppContext(application: Application): Context
companion object {
@Singleton
@Provides
fun provideString():String="this is test"
}
}
但是上面還是報(bào)一樣的錯(cuò)。 下面是Kotlin生成對(duì)應(yīng)的java 可以看出來(lái) Kotlin 里的靜態(tài)方法其實(shí)是生成了一個(gè)內(nèi)部靜態(tài)類(lèi)包含
@Module
@Metadata(...)
public abstract class ApplicationModule {
public static final ApplicationModule.Companion Companion = new ApplicationModule.Companion((DefaultConstructorMarker)null);
@Singleton
@Binds
@NotNull
public abstract Context provdeeAppContext(@NotNull Application var1);
@Metadata( ...)
public static final class Companion {
@Singleton
@Provides
@NotNull
public final String provideString() {
return "this is test";
}
private Companion() {
}
// $FF: synthetic method
public Companion(DefaultConstructorMarker $constructor_marker) {
this();
}
}
}
不知道這個(gè) dagger2 后期版本會(huì)不會(huì)修改 暫時(shí)能做到的方式就是避免 @Provides 不要寫(xiě)在抽象類(lèi)里 把@Binds標(biāo)記的抽象方法 寫(xiě)在另一個(gè)類(lèi)里 然后 再用非抽象類(lèi) include 進(jìn)來(lái) 如下
@Module
abstract class ApplicationBindsModule {
@Singleton
@Binds
abstract fun provdeeAppContext(application: Application): Context
}
@Module(includes = arrayOf(ApplicationBindsModule ::class))
class ApplicationProvidesModule {
@Singleton
@Provides
fun provideString(context:Context):String{
return "this is test ${context.packageName}"
}
}
或是用Component如下
@Module
abstract class ApplicationBindsModule {
@Singleton
@Binds
abstract fun provdeeAppContext(application: Application): Context
}
@Module
class ApplicationProvidesModule {
@Singleton
@Provides
fun provideString(context:Context):String{
return "this is test ${context.packageName}"
}
}
@Component(modules = arrayOf(ApplicationBindsModule::class,ApplicationProvidesModule::class))
public interface AppCompoent:AndroidInjector<GankApplication>{
...
}