計(jì)一次 Dagger2 android kotlin 的坑

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>{
 ...
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容