ejemplo - viewmodel android
Mejores prácticas para Android MVVM startActivity (3)
Eso es absolutamente perfecto para ponerlo dentro de ViewModel
, sin embargo, necesita configurar su ViewModel
desde Activity
/ Fragment
.
Aquí hay algunos enlaces que puede seguir para aprender sobre la arquitectura MVVM.
Acercándose a Android con MVVM
Android MVVM
https://github.com/ivacf/archi
People-MVVM
MVVM en Android: lo que necesitas saber
Estoy creando una aplicación de Android utilizando MVVM y DataBinding. Y tengo una función dentro de mi ViewModel que inicia una actividad. ¿Está bien tener una llamada onClick dentro de un ViewModel?
Me gusta esto.
public class MyViewModel {
public void onClick(View view, long productId) {
Context context = view.getContext();
Intent intent = new Intent(context, ProductDetailActivity.class);
intent.putExtra("productId", productId);
context.startActivity(intent);
}
}
Y en mi XML:
...
android:onClick="@{(v) -> viewModel.onClick(v, viewModel.product.id)}">
¿O sería una mejor práctica moverlo a la Vista y llamarlo desde EventBus o Rx y tener solo POJO en mi ViewModel?
La forma en que lo hago es, en tu ViewModel:
val activityToStart = MutableLiveData<Pair<KClass<*>, Bundle?>>()
Esto le permite verificar la clase de Actividad iniciada y los datos pasados en el Paquete. Luego, en tu Actividad, puedes agregar este código:
viewModel.activityToStart.observe(this, Observer { value ->
val intent = Intent(this, value.first.java)
if(value.second != null)
intent.putExtras(value.second)
startActivity(intent)
})
La respuesta a tu pregunta es ¿cuál es tu objetivo?
Si desea utilizar MVVM para separar las preocupaciones de manera que pueda probar su Viewmodel
unidad, debe intentar mantener todo lo que requiera un Context
separado de su Viewmodel
. El Viewmodel
contiene la lógica de negocios central de su aplicación y no debe tener dependencias externas.
Sin embargo, me gusta a dónde va :) Si la decisión de qué Actividad se abre es en la Vista, entonces es muy difícil escribir una prueba de JUnit para ella. Sin embargo, puede pasar un objeto al Viewmodel
que realiza la llamada startActivity()
. Ahora, en su prueba de unidad , puede simplemente burlarse de este objeto y verificar que se abra la Activity
correcta