Dagger 2 Предоставляет анонимные функции Kotlin Build Fail - PullRequest
0 голосов
/ 17 октября 2018

с кинжалом и котлином.Когда я скомпилировал следующий код:

@Module
 class NetworkModule {

@Provides
fun retrofit() =  {
     Retrofit.Builder()
            .baseUrl(Constant.URL.BASE_URL)
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .addConverterFactory(GsonConverterFactory.create())
            .build()
  }

}

Сборка завершается неудачей со следующей неясной ошибкой:

     /Users/saurabh/Saurabh/google-sample-mvp-rxjava/UserListApp-AndroidClient-Kotlin/app/build/generated/data_binding_base_class_source_out/debug/dataBindingGenBaseClassesDebug/out/com/example/saurabh/userappmvp/databinding/ItemUserBinding.java:49: error: cannot find symbol
  protected ItemUserBinding(DataBindingComponent _bindingComponent, View _root,
                            ^
  symbol:   class DataBindingComponent
  location: class ItemUserBinding
e: /Users/saurabh/Saurabh/google-sample-mvp-rxjava/UserListApp-AndroidClient-Kotlin/app/build/generated/data_binding_base_class_source_out/debug/dataBindingGenBaseClassesDebug/out/com/example/saurabh/userappmvp/databinding/ItemUserBinding.java:80: error: cannot find symbol
      boolean attachToRoot, @Nullable DataBindingComponent component) {
                                      ^
  symbol:   class DataBindingComponent
  location: class ItemUserBinding
e: /Users/saurabh/Saurabh/google-sample-mvp-rxjava/UserListApp-AndroidClient-Kotlin/app/build/generated/data_binding_base_class_source_out/debug/dataBindingGenBaseClassesDebug/out/com/example/saurabh/userappmvp/databinding/ItemUserBinding.java:91: error: cannot find symbol
      @Nullable DataBindingComponent component) {
                ^
  symbol:   class DataBindingComponent
  location: class ItemUserBinding
e: /Users/saurabh/Saurabh/google-sample-mvp-rxjava/UserListApp-AndroidClient-Kotlin/app/build/generated/data_binding_base_class_source_out/debug/dataBindingGenBaseClassesDebug/out/com/example/saurabh/userappmvp/databinding/ItemUserBinding.java:99: error: cannot find symbol
  public static ItemUserBinding bind(@NonNull View view, @Nullable DataBindingComponent component) {
                                                                   ^
  symbol:   class DataBindingComponent
  location: class ItemUserBinding
e: /Users/saurabh/Saurabh/google-sample-mvp-rxjava/UserListApp-AndroidClient-Kotlin/app/build/tmp/kapt3/stubs/debug/com/example/saurabh/userappmvp/dependency/UserComponent.java:9: error: [Dagger/MissingBinding] com.example.saurabh.userappmvp.datasource.remote.UserOperation cannot be provided without an @Provides-annotated method.
    public abstract void inject(@org.jetbrains.annotations.NotNull()
                         ^
      com.example.saurabh.userappmvp.datasource.remote.UserOperation is injected at
          com.example.saurabh.userappmvp.datasource.remote.RemoteDbHelper.<init>(userOperation)
      com.example.saurabh.userappmvp.datasource.remote.RemoteDbHelper is injected at
          com.example.saurabh.userappmvp.dependency.RepositoryModule.remoteDataSource(remoteDbHelper)
      @javax.inject.Named("remote") com.example.saurabh.userappmvp.datasource.UserRepositoryContract is injected at
          com.example.saurabh.userappmvp.datasource.UserRepository.<init>(…, remote)
      com.example.saurabh.userappmvp.datasource.UserRepository is injected at
          com.example.saurabh.userappmvp.userlist.presentation.UserListFragment.repository
      com.example.saurabh.userappmvp.userlist.presentation.UserListFragment is injected at
          com.example.saurabh.userappmvp.dependency.UserComponent.inject(com.example.saurabh.userappmvp.userlist.presentation.UserListFragment)

После 2 дней борьбы я понял, что это связано с назначением анонимной функциик функции обеспечивает.Я обновил код и удалил анонимную функцию, затем она скомпилировалась без ошибок.

Надеюсь, это поможет другим, кто борется с той же проблемой.

Рабочий код.

@Module
class NetworkModule {

@Provides
fun retrofit() : Retrofit {
    return Retrofit.Builder()
            .baseUrl(Constant.URL.BASE_URL)
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .addConverterFactory(GsonConverterFactory.create())
            .build()
}   
}

Может кто-нибудь объяснить, почему предыдущий код с анонимной функцией не компилировался?

1 Ответ

0 голосов
/ 17 октября 2018
fun retrofit(): () -> Retrofit =  {
     Retrofit.Builder()
          .baseUrl(Constant.URL.BASE_URL)
          .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
          .addConverterFactory(GsonConverterFactory.create())
          .build()
  }

Vs.

fun retrofit(): Retrofit =  
     Retrofit.Builder()
          .baseUrl(Constant.URL.BASE_URL)
          .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
          .addConverterFactory(GsonConverterFactory.create())
          .build()

Второй будет работать.

...