ejemplo android mvvm android-databinding decoupling

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