Лучшая практика для Android MVVM startActivity
Я создаю приложение для Android, используя MVVM и привязку данных. И у меня есть функция внутри моей ViewModel, которая запускает действие. Нормально ли иметь вызов onClick внутри ViewModel?
такой.
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);
}
}
и в моем XML:
...
android:onClick="@{(v) -> viewModel.onClick(v, viewModel.product.id)}">
или было бы лучше переместить его в представление и вызвать его из EventBus или Rx и иметь только POJO в моей ViewModel?
3 ответов
ответ на ваш вопрос: какова ваша цель?
если вы хотите использовать MVVM для разделения проблем, так что вы можете проверить свои Viewmodel
тогда вы должны попытаться сохранить все, что требует Context
отдельно от вашего Viewmodel
. The Viewmodel
содержит основную бизнес-логику вашего приложения и не должен иметь внешних зависимостей.
однако мне нравится, куда вы идете :) если решение, какая деятельность открыта, лежит в представлении, то очень трудно написать тест JUnit для него. Однако вы можете передать объект в Viewmodel
которая выполняет startActivity()
звонок. Теперь в вашем единица теста вы можете просто издеваться над этим объектом и убедиться, что правильно Activity
открыт
это абсолютно идеально, чтобы положить его внутрь ViewModel
, однако вам нужно установить свой ViewModel
с Activity
/Fragment
.
вот некоторые ссылки, которые вы можете следовать, чтобы узнать архитектуру MVVM.
приближается Android с MVVM
Android MVVM
https://github.com/ivacf/archi
People-MVVM
MVVM на Android: что вам нужно знать
то, как я это делаю, в вашей ViewModel:
val activityToStart = MutableLiveData<Pair<KClass<*>, Bundle?>>()
Это позволяет проверить класс начатой активности и данные, переданные в комплекте. Затем, в вашей деятельности, вы можете добавить этот код:
viewModel.activityToStart.observe(this, Observer { value ->
val intent = Intent(this, value.first.java)
if(value.second != null)
intent.putExtras(value.second)
startActivity(intent)
})