Jetpack ViewModel+LiveData+DataBinding初試

Jetpack是google現(xiàn)在主推的框架, 從開(kāi)發(fā)效率,代碼健壯程度,對(duì)未來(lái)的兼容性, 相較舊的開(kāi)發(fā)框架都有一定優(yōu)勢(shì). 所以開(kāi)始學(xué)習(xí)吧

簡(jiǎn)介

1.ViewModel

主要優(yōu)勢(shì)之一, 就是在同一個(gè)Activity內(nèi), 跨Fragment共享數(shù)據(jù)非常方便
之二, 就是在系統(tǒng)設(shè)置改變后, Activity丟失狀態(tài)的問(wèn)題可以很好的解決
其他希望大佬可以補(bǔ)充下

2.liveData

既是一個(gè)觀察者(觀察生命周期, 適當(dāng)?shù)臅r(shí)候把自己回收)

也是一個(gè)被觀察者(數(shù)據(jù)變更進(jìn)行通知,但是數(shù)據(jù)通知只發(fā)生在生命周期活躍狀態(tài) STARTED、RESUMED)。

3.dataBinding

數(shù)據(jù)與界面雙向綁定

xml可以直接回調(diào)bean的方法

數(shù)據(jù)變更后, xml會(huì)自動(dòng)更新

用起來(lái)

1.viewBinding

用于替代findViewById() 和 Butterknife

參考官方文檔

順便 "kotlin-android-extensions" 插件也已經(jīng)過(guò)期了 官方建議替換為viewBinding方式

版本前提:AndroidStudio 3.6+ Gradle plugin 3.6+ kotlin 1.4+

plugins{
    //如果要用到@Parcelize
    id 'kotlin-parcelize'
}


android{
    //Android studio and Gradle 3.6+
    viewBinding {
    enabled = true
    } 
    //Android studio and Gradle 4.0+
    buildFeatures {
       viewBinding true
  }
}

代碼中綁定

//例如 對(duì)應(yīng)的xml文件為  aaa_bbb.xml  其中有 btn_id1 的按鈕
//會(huì)自動(dòng)生成 AaaBbbBinding類
//setContentView(R.layout.aaa_bbb.xml) 替換為如下
var binding = DataBindingUtil.setContentView<AaaBbbBinding>(this, R.layout.aaa_bbb)
var btn_id1:Button = binding.btn_id1

至此, xml中的任何view都可以通過(guò) binding.xxx 取到 (xxx對(duì)應(yīng) view的id)

2.ViewModel+LiveData+DataBinding

build.gradle

android{
    //Android studio and Gradle 3.6+
    viewBinding {
    enabled = true
    } 
    dataBinding {
    enabled true
  }
    //Android studio and Gradle 4.0+
    buildFeatures {
        dataBinding true
        viewBinding true
  }
}

dependencies{
    def lifecycle_version = "2.3.1"
    // ViewModel
  implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
  // LiveData
  implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
}

定義ViewModel

class ExampleA:ViewModel(){
     var value:MutableLiveData<Int> = MutableLiveData(0)
     
     fun setVal(index:Int){
      this.value.value = index
   }
   
   fun add(){ 
      setVal(this.value.value!! + 1)
   }
}

在xml中指定ViewModel

指定ViewModel類型 為 ExampleA ,別名為 exampleVm

使用 '@{exampleVm.value}' 取值, 如果有其他字符串混合 , 其他字符串用雙引號(hào)""+

也可以使用@{exampleVm::add} 調(diào)用方法, 注意這里簽名需要保持一致

其他用法參考官方文檔

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">
    <data>
        <variable
            name="exampleVm"
            type="com.xx.xxx.bean.viewmodel.ExampleA" />
    </data>
    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
         <Button
            android:id="@+id/btn_id1"
            android:layout_width="200dp"
            android:onClick="@{(v)-> exampleVm.add()}"
            android:layout_height="wrap_content"
            android:text='@{"當(dāng)前value "+exampleVm.value}'
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

在activity/fragment中 綁定view model

var binding = DataBindingUtil.setContentView<AaaBbbBinding>(this, R.layout.aaa_bbb)
binding.exampleVm = ViewModelProvider(this).get(ExampleA::class.java)
//必須關(guān)聯(lián)生命周期 否則刷新無(wú)效
binding.lifecycleOwner = this

以上就完成了這三個(gè)庫(kù)的簡(jiǎn)單配合使用, 如有錯(cuò)誤, 請(qǐng)勞煩指正

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容