У меня проблема с компонентами новой архитектуры в Kotlin, когда я создаю компонент ViewModel рекомендованным способом (в методе onCreate ()), результат будет следующим:
- после изменения ориентации активности я получил тот же экземпляр 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 для внедрения ListViewModel, я получал новый экземпляр ListViewModel каждый раз при воссоздании Activity. Вот код 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: не удалось сохранить ViewModel для
происходит из Android-класса HolderFragment с пакетом android.arch.lifecycle.
Есть что-то, чего мне не хватало при работе с Dagger и новыми арочными компонентами?
dagger-android-support
приводит к ошибкеViewModelStores
- person Ismael Di Vita   schedule 04.11.2017