簡體   English   中英

ViewModel + Data Binding中的最佳實踐和模式。 ViewModel中的ObservableField好嗎?

[英]Best practices and patterns in ViewModel + Data Binding. Is ObservableField in ViewModel OK?

通過示例,我看到了兩種使用Android架構組件的MVVM方法。

第一種方法:

  1. ViewModel提供LiveData
  2. Activity訂閱LiveData
  3. 當觀察者調用Activity ,將數據設置為ViewModel ObservableField
  4. 整個ViewModel傳遞給綁定。
  5. 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)
        }
    }

缺點:這種方法有任何缺點嗎?

第二種方法:

  1. ViewModel提供LiveData
  2. Activity訂閱LiveData
  3. 當名為Activity觀察者傳遞給綁定時
  4. 只有需要的對象(pojo)被傳遞給綁定

優點:這種方法的任何優點?

缺點:狀態應該從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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM