一.學習視頻來源:
- https://www.bilibili.com/video/BV1sJ41127EMlongway777
- 模型圖來源也全截取來自該Up的視頻
二. 建立樣例
1. 準備
- 上一個ViewModel中,每次更新ViewModel的number屬性,都要再次手動設置界面更新
- res可使用Vector Assert矢量圖標
2.核心代碼
- 首先創建一個類繼承ViewModel,最新版創建ViewModel會自動部署了ViewModel所需的依賴
1)創建LiveData 容器
2)創建私有屬性_number,公有屬性number,公有方法進行相互轉換【非常好用】
class ViewModelWithLiveData : ViewModel() {
//創建LiveData容器
private val _number=MutableLiveData<Int>(0).also {
it.value=0//使用also初始化
}
val number: LiveData<Int>
get()=_number//get()可省略 內部獲取,不開放
fun modifyNumber(aNumber:Int){
_number.value=_number.value?.plus(aNumber)
}//下劃線規約內部只讀
}
- 來到MAC
1)原創建ViewModel對象比較複雜
2) 使用依賴組件,這個要求JVM1.8,來到添加依賴的gradle,使用這種方式聲明就簡單許多
implementation ‘androidx.fragment:fragment-ktx:1.2.2’
原方式:val viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
改版後更符合kotlin的習慣
改版:val myviewModel:ViewModelWithLiveData by viewModels<ViewModelWithLiveData>()
- 剩下的和之前ViewModel測試差不多
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val myviewModel:ViewModelWithLiveData by viewModels<ViewModelWithLiveData>()
//建立livedata觀察
myviewModel.number.observe(this, Observer {
TextView.text=it.toString()
})
imageButton.setOnClickListener{
myviewModel.modifyNumber(1)
//這邊賦值完之後viewmodel做了LiveData的監聽會自動保存,就不用再寫設置了
}
imageButton2.setOnClickListener{
myviewModel.modifyNumber(-1)
}
}
}
三.完成LifeData後,若系統設置了不允許後臺運行(掛起但沒銷燬),這裏就需要寫savedstate保存狀態
class ViewModelWithLiveData(private val savedStateHandle: SavedStateHandle) : ViewModel() {
//創建LiveData容器
private val _number=MutableLiveData<Int>(0).also {
if(!savedStateHandle.contains("number")){
savedStateHandle.set("number",0)
}
it.value=0//使用also初始化
}
val number: LiveData<Int>
get()=_number//get()可省略 內部獲取,不開放
fun modifyNumber(aNumber:Int){
_number.value=_number.value?.plus(aNumber)
savedStateHandle.set("number",_number.value)
}//下劃線規約內部只讀
}