[英]ObservableField value inside ViewModel does not update UI with data binding
[英]Best practices and patterns in ViewModel + Data Binding. Is ObservableField in ViewModel OK?
通過示例,我看到了兩種使用Android架構組件的MVVM方法。
第一種方法:
ViewModel
提供LiveData
Activity
訂閱LiveData
Activity
,將數據設置為ViewModel
ObservableField
。 ViewModel
傳遞給綁定。 在xml
您只需將ObservableField
設置為value
<ProgressBar android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" app:visibleGone="@{viewmodel.listLoading}"/> <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/swiperefresh" android:layout_width="match_parent" android:layout_height="match_parent" app:refreshing="@{viewmodel.listRefreshing}" app:onRefreshListener="@{() -> viewmodel.refreshList()}" app:visibleGone="@{!viewmodel.listLoading}">
優點:我不需要傳遞狀態(例如“loading”),因為我在ViewModel
更新listLoading
ObservableField
,如下所示:
val listLoading = ObservableBoolean(false)
/** other observable fields go here **/
val list: MutableLiveData<List<Item>> = MutableLiveData()
fun loadList() {
listLoading.set(true)
repo.getList { items ->
list.value = items
listLoading.set(false)
}
}
缺點:這種方法有任何缺點嗎?
第二種方法:
ViewModel
提供LiveData
Activity
訂閱LiveData
Activity
觀察者傳遞給綁定時 優點:這種方法的任何優點?
缺點:狀態應該從ViewModel
返回。 在此示例中,Google數據包含在Resource
對象中。
第一種方法用於Google的另一個示例應用
我想知道具有使用Android數據綁定和Android Arch Components的更多經驗的開發人員的兩種模式的優缺點。
您應該考慮使用業務邏輯拆分視圖邏輯。
由於您有一個使用數據綁定和AAC處理的ViewModel,您還應該在視圖(布局)中分離邏輯。
只需將兩個變量傳遞給您的布局。 一個是VievModel,它處理業務邏輯,如按下按鈕和處理邏輯,第二個是View(片段)。
之后你可以使用
app:onRefreshListener="@{() -> yourViewFragment.refreshList()}"
並且如果當前沒有訂閱視圖,則避免出現“上下文泄漏”或無法解決的問題。
由於onRefreshListener綁定到一個片段,因此可以在片段內傳遞它。
您需要在ViewModel中創建一個LiveData或ObservableField來處理這種操作,因為如果您暫停並恢復該片段,您將再次觀察LiveData。 這也意味着您將再次獲得最后的數據。
可以在ViewModel中使用的示例:
<Textview ... name="@{viewModel.dataOfYourModel}" onClick="@{viewModel.doNetworkCall}" />
黃金法則:每個以android。*開頭的包/導入都不應該在viewmodel中,除了android.arch。*組件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.