Nueva architecture con Dagger y Kotlin

Tengo un problema con los componentes de Nueva Arquitectura en Kotlin, cuando creo el componente ViewModel de manera recomendada (en el método onCreate ()) el resultado es el siguiente:

  • después de que cambie la orientación de la actividad, obtuve la misma instancia de ViewModel que antes

Esta es la forma en que creo esto

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() } 

Pero cuando he usado Dagger para inyectar ListViewModel obtuve una nueva instancia de ListViewModel cada vez que se recreaba Activity. Aquí hay un código de 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 } 

} Entonces el método ListActivity onCreate () se ve así:

 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() } } 

Y hay lo que he notado después de iniciar session:

 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] 

El error que he recibido:

ViewModelStores: Error al save un ViewModel para

proviene de la class de Android HolderFragment con el package android.arch.lifecycle.

¿Hay algo que extrañé trabajando con Dagger y nuevos componentes de arco?

Solutions Collecting From Web of "Nueva architecture con Dagger y Kotlin"

La forma en que hago esto es solo proporcionando ViewModelFactory usando Dagger. Luego se inyecta en la actividad y se llama a ViewModelProviders.of(listActivity, factory).get(ListViewModel::class.java) desde allí. La razón por la que su enfoque no funciona es que AndroidInjection.inject() creará ViewModel antes de onCreate, lo que conduce a un comportamiento no definido.

También vea: https://github.com/googlesamples/android-architecture-components/issues/202

No uso AndroidInjection.inject() porque crea un nuevo componente Dagger. Creo un Dagger Component en la class Application y utilizo esa instancia de componente para invocar inject en todos los demás lugares de la aplicación. De esta forma, tus singletons se inicializan solo una vez.