![](/img/trans.png)
[英]How to validate form ViewModel with MVVM Data binding in Android?
[英]How to use android navigation without binding to UI in ViewModel (MVVM)?
我正在使用在 Google I\/O 2018 上展示的 android 導航,似乎我可以通過綁定到某個視圖或使用
NavHost<\/code>從 Fragment 獲取它來使用它。
但我需要的是根據幾個條件從我的第一個片段從 ViewModel 導航到另一個特定視圖。
對於
ViewModel<\/code> ,我擴展了
AndroidViewModel<\/code> ,但我不明白下一步該怎么做。
我無法將
getApplication<\/code>轉換為 Fragment\/Activity ,也無法使用
NavHostFragment<\/code> 。
此外,我不能只將導航綁定到
onClickListener<\/code> ,因為
startFragment<\/code>只包含一個
ImageView<\/code> 。
如何從
ViewModel<\/code>導航?
class CaptionViewModel(app: Application) : AndroidViewModel(app) {
private val dealerProfile = DealerProfile(getApplication())
val TAG = "REGDEB"
fun start(){
if(dealerProfile.getOperatorId().isEmpty()){
if(dealerProfile.isFirstTimeLaunch()){
Log.d(TAG, "First Time Launch")
showTour()
}else{
showCodeFragment()
Log.d(TAG, "Show Code Fragment")
}
}
}
private fun showCodeFragment(){
//??
}
private fun showTour(){
//??
}
}
如何從ViewModel導航?
答案是請不要。 ViewModel旨在存儲和管理與UI相關的數據。
新答案
在我之前的回答中,我說我們不應該從ViewModel導航,原因是因為導航,ViewModel必須引用Activities / Fragments,我相信(也許不是最好的,但我仍然相信它)永遠不會一個好主意。
但是,在Google推薦的應用程序架構中,它提到我們應該從模型中驅動UI 。 在我想之后,他們對此有何意義?
所以我查看了“android-architecture”中的一個示例,我發現了Google如何做到這一點的有趣方式。
請在這里查看: todo-mvvm-databinding
事實證明,他們確實從模型中驅動UI 。 但是怎么樣?
有兩種方法我可以推薦這樣做。
您可以使用可選的自定義枚舉類型並觀察視圖中的變化:
enum class NavigationDestination {
SHOW_TOUR, SHOW_CODE_FRAGMENT
}
class CaptionViewModel(app: Application) : AndroidViewModel(app) {
private val dealerProfile = DealerProfile(getApplication())
val TAG = "REGDEB"
private val _destination = MutableLiveData<NavigationDestination?>(null)
val destination: LiveData<NavigationDestination?> get() = _destination
fun setDestinationToNull() {
_destination.value = null
}
fun start(){
if(dealerProfile.getOperatorId().isEmpty()){
if(dealerProfile.isFirstTimeLaunch()){
Log.d(TAG, "First Time Launch")
_destination.value = NavigationDestination.SHOW_TOUR
}else{
_destination.value = NavigationDestination.SHOW_CODE_FRAGMENT
Log.d(TAG, "Show Code Fragment")
}
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.