lateinit 属性 dispatchingAndroidInjector 尚未初始化

And*_*ice 5 android kotlin dagger-2

当我在 dagger2 中运行我的片段时,我收到上述错误“lateinit property dispatchingAndroidInjector has not been initialized”
上面的错误是在我下面的应用程序类中触发的

KotlinTemplateApplication.kt

     class KotlinTemplateApplication:Application(), HasActivityInjector  {
        lateinit var retroComponent:RetroComponent

@Inject
lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Activity>

companion object {
    @get:Synchronized
    lateinit var instance: KotlinTemplateApplication
     private set
}

override fun onCreate() {
    super.onCreate()
    instance = this
    retroComponent = DaggerRetroComponent.builder().retroModule(RetroModule(APIURL.BASE_URL)).build()
    //retroComponent.inject()

}



   fun fetchRetroComponent():RetroComponent{
   return retroComponent
   }

override fun activityInjector(): AndroidInjector<Activity> {
    return dispatchingAndroidInjector
}
   }
Run Code Online (Sandbox Code Playgroud)


我的片段类如下:
我在片段的 onAttach() 方法中调用了与匕首相关的代码:

RetroDIFragment:

      class RetroDIFragment : Fragment() {
// TODO: Rename and change types of parameters
private var param1: String? = null
private var param2: String? = null
lateinit var retroDIListViewModel: RetroDIListViewModel
lateinit var retroFitDIView: View
@Inject
lateinit var apiService: APIService

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    arguments?.let {
        param1 = it.getString(ARG_PARAM1)
        param2 = it.getString(ARG_PARAM2)
    }
    retroDIListViewModel = ViewModelProviders.of(activity!!).get(RetroDIListViewModel::class.java)
}

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                          savedInstanceState: Bundle?): View? {
    // Inflate the layout for this fragment
    retroFitDIView =  inflater.inflate(R.layout.fragment_retro_di, container, false)

    return retroFitDIView
}

override fun onAttach(context: Context?) {
    super.onAttach(context)
    AndroidInjection.inject(activity)
    KotlinTemplateApplication.instance.fetchRetroComponent().inject(this@RetroDIFragment)

    retroDIListViewModel.fetchPostsFromWebSevice(apiService).observe(this,object : Observer<List<RetroModel>>{
        override fun onChanged(t: List<RetroModel>?) {
            for (i in t!!.indices)
                println(t[i].id)
        }

    })
}
companion object {
    /**
     * Use this factory method to create a new instance of
     * this fragment using the provided parameters.
     *
     * @param param1 Parameter 1.
     * @param param2 Parameter 2.
     * @return A new instance of fragment RetroDIFragment.
     */
    // TODO: Rename and change types and number of parameters
    @JvmStatic
    fun newInstance(param1: String, param2: String) =
            RetroDIFragment().apply {
                arguments = Bundle().apply {
                    putString(ARG_PARAM1, param1)
                    putString(ARG_PARAM2, param2)
                }
            }
}
    }
Run Code Online (Sandbox Code Playgroud)


我的组件如下:

RetroComponent :

 @Singleton
@Component(modules = arrayOf(RetroModule::class))
  interface RetroComponent {
    fun inject(retroDIFragment: RetroDIFragment)
   }
Run Code Online (Sandbox Code Playgroud)


我的模块如下:

 @Module
   public class RetroModule(var urlPath:String) {


init{
    this.urlPath  = urlPath
}

@Singleton
@Provides
fun provideServiceAPI(retrofit: Retrofit):APIService{
    return retrofit.create(APIService::class.java)
}

@Singleton
@Provides
fun provideRetrofit():Retrofit{
    val retrofit = Retrofit.Builder()
            .baseUrl(urlPath)
            .addConverterFactory(ScalarsConverterFactory.create())
            .addConverterFactory(GsonConverterFactory.create())
            .client(providesOkHttpClientBuilder())
            .build()
    return  retrofit

}


private fun providesOkHttpClientBuilder(): OkHttpClient {

    val httpClient = OkHttpClient.Builder()
    return httpClient.readTimeout(1200, TimeUnit.SECONDS)
            .connectTimeout(1200, TimeUnit.SECONDS).build()

}
}
Run Code Online (Sandbox Code Playgroud)


我的活动如下

class RetroFitActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_retro_fit)
    supportFragmentManager.beginTransaction().replace(R.id.container_retro_di, RetroDIFragment()).commit()
}
   }
Run Code Online (Sandbox Code Playgroud)


我在 Gradle 中包含了以下代码:

 implementation 'com.google.dagger:dagger:2.19'
implementation 'com.google.dagger:dagger-android:2.19'
annotationProcessor 'com.google.dagger:dagger-android-processor:2.19'
annotationProcessor 'com.google.dagger:dagger-compiler:2.19'
kapt 'com.google.dagger:dagger-android-processor:2.19'
kapt 'com.google.dagger:dagger-compiler:2.19'
//moxy
compile 'com.arello-mobile:moxy-app-compat:1.1.1'
kapt 'com.arello-mobile:moxy-compiler:1.1.1'
Run Code Online (Sandbox Code Playgroud)




谁能帮我解决这个问题。

nay*_*rde 5

您需要更改 AppComponent 类的注入方法参数:

@Singleton
@Component(modules = [
        AndroidInjectionModule::class,
        ActivityModule::class,
        AppModule::class
])
interface AppComponent {

        @Component.Builder
        interface Builder {
                @BindsInstance
                fun application(application: Application): Builder

                fun build(): AppComponent
        }

        fun inject(app: Application) // This is the piece of code you need to change
}
Run Code Online (Sandbox Code Playgroud)
@Singleton
@Component(modules = [
        AndroidInjectionModule::class,
        ActivityModule::class,
        AppModule::class
])
interface AppComponent {

        @Component.Builder
        interface Builder {
                @BindsInstance
                fun application(application: Application): Builder

                fun build(): AppComponent
        }

        fun inject(app: YourCustomAppClass) // Change to your custom app class
}
Run Code Online (Sandbox Code Playgroud)

另外,你在哪里做这个

  DaggerAppComponent
            .builder()
            .application(yourAppInstance)
            .build()
            .inject(yourAppInstance)
Run Code Online (Sandbox Code Playgroud)

yourAppInstance 需要是 YourCustomApp 类而不是 Application 类型。


tyn*_*ynn 1

dispatchingAndroidInjector属性必须最终设置。

@Inject
lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Activity>
Run Code Online (Sandbox Code Playgroud)

由于它带有注释@Inject,看起来您想注入它。但由于KotlinTemplateApplication是 an Application,您需要在组件上手动执行此操作:

retroComponent.inject(this@KotlinTemplateApplication)
Run Code Online (Sandbox Code Playgroud)