gpt4 book ai didi

android - 使用 Dagger 和 Kotlin 的新架构

转载 作者:行者123 更新时间:2023-11-30 00:17:08 25 4
gpt4 key购买 nike

我在使用 Kotlin 中的新架构组件时遇到问题,当我以推荐的方式(在 onCreate() 方法中)创建 ViewModel 组件时,结果如预期的那样:

  • Activity 方向改变后,我得到了和以前一样的 ViewModel 实例

这是我创建它的方式

override fun onCreate(savedInstanceState: Bundle?) {
AndroidInjection.inject(this)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_list)

val arrayMap = ArrayMap<Class<out ViewModel>, ViewModel>()
arrayMap.put(ListViewModel::class.java, ListViewModel(webApi, repoDao))
val factory = ViewModelFactory(arrayMap)
listViewModel = ViewModelProviders.of(this, factory).get(ListViewModel::class.java)

listViewModel.items.observe({ this.lifecycle }) {
Toast.makeText(this, it?.joinToString { it + " " } ?: "null", Toast.LENGTH_SHORT).show()
}

但是当我使用 Dagger 注入(inject) ListViewModel 时,每次重新创建 Activity 时我都会得到 ListViewModel 的新实例。这是 Dagger ListActivityModel 的代码。

@Module @ListActivityScopeclass ListActivityModule {
@Provides
@ListActivityScope
fun provideListViewModel(webApi: WebApi, repoDao: RepoDao, listActivity: ListActivity): ListViewModel {
val arrayMap = ArrayMap<Class<out ViewModel>, ViewModel>()
arrayMap.put(ListViewModel::class.java, ListViewModel(webApi, repoDao))
val factory = ViewModelFactory(arrayMap)
val result = ViewModelProviders.of(listActivity, factory).get(ListViewModel::class.java)
return result
}

}然后 ListActivity onCreate() 方法如下所示:

override fun onCreate(savedInstanceState: Bundle?) {
AndroidInjection.inject(this)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_list)
listViewModel.items.observe({ this.lifecycle }) {
Toast.makeText(this, it?.joinToString { it + " " } ?: "null", Toast.LENGTH_SHORT).show()
}
}

登录后我注意到:

D/ListActivity: ---> onCreate() ListActivity: = [com.example.dom.app.new_arch.ListActivity@a0f2778]
D/ListActivity: ---> onCreate() listViewModel: = [com.example.dom.app.new_arch.ListViewModel@54a8e51]

//Activity orientation changes

E/ViewModelStores: Failed to save a ViewModel for com.example.dom.app.new_arch.ListActivity@a0f2778
D/ListActivity: ---> onCreate() ListActivity: = [com.example.dom.app.new_arch.ListActivity@6813433]
D/ListActivity: ---> onCreate() listViewModel: = [com.example.dom.app.new_arch.ListViewModel@55cf3f0]

我收到的错误:

ViewModelStores: Failed to save a ViewModel for

来自 Android 类 HolderFragment 和包 android.arch.lifecycle。

在使用 Dagger 和新的架构组件时我错过了什么?

最佳答案

问题与 Dagger 注入(inject)和 Activity 创建的顺序有关。 View 模型实现依赖于非视觉 fragment 来标识。通过在 Activity 完成 onCreate 之前注入(inject) viewModelProvider,它无法完成此关联。

因为 super.onCreate 不太可能依赖于您正在注入(inject)的东西,请尝试在调用 super.onCreate 之后注入(inject),您应该没问题。

我遇到了完全相同的问题,并通过更改顺序解决了它。

特别是从您的代码而不是:

override fun onCreate(savedInstanceState: Bundle?) {
AndroidInjection.inject(this)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_list)

搭配:

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
AndroidInjection.inject(this)
setContentView(R.layout.activity_list)

日本

关于android - 使用 Dagger 和 Kotlin 的新架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47055985/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com