lateinit属性apiComponent尚未在Dagger 2中初始化

问题描述 投票:0回答:1

我正在尝试在recyclerview中实现Dragger 2,但在运行该应用程序时出现以下错误:

kotlin.UninitializedPropertyAccessException: lateinit property apiComponent has not been initialized
        at com.kabelash.squarerepos.MyRetroApplication$Companion.getApiComponent(MyRetroApplication.kt:18)
        at com.kabelash.squarerepos.network.viewmodel.RetroViewModelFactory.create(RetroViewModelFactory.kt:21)
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:164)
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:130)
        at com.kabelash.squarerepos.network.view.RetroFragment.initViewModel(RetroFragment.kt:43)
        at com.kabelash.squarerepos.network.view.RetroFragment.onCreate(RetroFragment.kt:29)

APIComponent.kt

@Singleton
@Component(modules = [AppModule::class, APIModule::class])
interface APIComponent {
    fun inject(retrofitRepository: RetrofitRepository)
    fun inject(retroViewModel: RetroViewModel)
    fun inject(retroFragment: RetroFragment)
    fun inject(retroViewModelFactory: RetroViewModelFactory)
}

NetworkActivity.kt类NetworkActivity:AppCompatActivity(){

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.network_layout)
    replaceFragment()
}


fun replaceFragment(){
   supportFragmentManager
       .beginTransaction()
       .replace(R.id.container_retro_room, RetroFragment())
       .commit()
}

}

RetroFragment.kt

class RetroFragment: Fragment() {

    lateinit var retroViewModel: RetroViewModel
    var fragmentView:View?=null
    private  var listAdapter: PostListAdapter?=null
    private var  postListLayoutBinding:PostListLayoutBinding?=null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        initViewModel()
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        postListLayoutBinding = DataBindingUtil.inflate(inflater, R.layout.post_list_layout,container,false)
        fragmentView = postListLayoutBinding?.root
        initAdapter()
        setAdapter()
        fetchRetroInfo()
        return  fragmentView
    }

    fun  initViewModel(){
        var retroViewModelFactory = RetroViewModelFactory()
        retroViewModel = ViewModelProviders.of(this,retroViewModelFactory).get(RetroViewModel::class.java)
    }

    fun fetchRetroInfo(){
        retroViewModel.postInfoLiveData?.observe(this,object:Observer<List<PostInfo>>{
            override fun onChanged(t: List<PostInfo>?) {
                t?.apply {
                    listAdapter?.setAdapterList(t)
                }


            }
        })
    }

    private fun setAdapter(){
        fragmentView?.post_list?.apply {
            layoutManager = LinearLayoutManager(activity)
            addItemDecoration(DividerItemDecoration(activity, DividerItemDecoration.VERTICAL))
            adapter = listAdapter
        }

    }

   private fun initAdapter(){
       listAdapter = PostListAdapter([email protected]())
   }

}

RetroViewModelFactory.ktclass RetroViewModelFactory:ViewModelProvider.Factory {lateinit var apiComponent:APIComponent@注入lateinit var retrofitRepository:RetrofitRepository

override fun <T : ViewModel?> create(modelClass: Class<T>): T {
 //   initDaggerComponent()
   var apiComponent : APIComponent =  MyRetroApplication.apiComponent
    apiComponent.inject(this)
    if (modelClass.isAssignableFrom(RetroViewModel::class.java)) {
        return RetroViewModel(retrofitRepository) as T
    }
    throw IllegalArgumentException("Unknown ViewModel class")
}

fun initDaggerComponent(){
    apiComponent =   DaggerAPIComponent
        .builder()
        .aPIModule(APIModule(APIURL.BASE_URL))
        .build()
    apiComponent.inject(this)
}

}

有人可以帮助解决此问题吗?我不知道。

编辑:

class MyRetroApplication : Application() {


    companion object {
        var ctx: Context? = null
        lateinit var apiComponent: APIComponent
    }
    override fun onCreate() {
        super.onCreate()
        ctx = applicationContext
        apiComponent = initDaggerComponent()

    }

    fun getMyComponent(): APIComponent {
        return apiComponent
    }

    fun initDaggerComponent(): APIComponent {
        apiComponent =   DaggerAPIComponent
            .builder()
            .aPIModule(APIModule(APIURL.BASE_URL))
            .build()
        return  apiComponent

    }
}
android kotlin dependency-injection retrofit2 dagger-2
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.