新的建筑与匕首和Kotlin

我在Kotlin的New Architecture组件中遇到了一个问题,那就是当我用建议的方式(在onCreate()方法)中创建ViewModel组件时,结果如下所示:

  • 在活动方向改变之后,我得到和以前一样的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时,每次重新创建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:无法保存ViewModel for

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

有什么我错过了与匕首和新的拱组件?

我这样做的方式是只提供使用Dagger的ViewModelFactory 。 然后它被注入到活动中,并从那里调用ViewModelProviders.of(listActivity, factory).get(ListViewModel::class.java) 。 你的方法不起作用的原因是AndroidInjection.inject()将在onCreate之前创建ViewModel,这导致了未定义的行为。

另见: https : //github.com/googlesamples/android-architecture-components/issues/202