【ViewModel】學習筆記

1.視頻來:

https://www.bilibili.com/video/BV1sJ41127EMlongway777

2. 具體操作

  1. emmm這位up的腦洞好有意思,想起來以前用h5做遙控器
  2. 旋轉屏幕時發現溫度初始化了 ,Activity未銷燬,而是重新繪製了,當然也再次執行oncreate,旋轉生命週期
  override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        var number=0
        textView.text="0"
        buttonPlus.setOnClickListener{
            //打開發現裏面沒有未實現的方法 it提示指當前的view
            textView.text=(++number).toString()
        }

        buttonMinus.setOnClickListener{
            //打開發現裏面沒有未實現的方法 it提示指當前的view
            textView.text=(--number).toString()
        }
    }

在這裏插入圖片描述

  1. 這個時候使用ViewModel:存儲和管理 UI 相關數據,程序不銷燬(ondestory),VM保存的數據不消失
    1)這裏建立了一個類,繼承ViewModel()
    1.1)規約,變量名帶下劃線爲私有隻讀,建立公有的用於轉換和set
    a. 設置_內部私有,通過公有方法可賦值
    b. 設置可訪問的number,其值由_number賦予,無法直接拿到並對_number操作
class MyViewModel:ViewModel() {
    /*val number:MutableLiveData<Int>
    init {
        number= MutableLiveData()
        number.value=0
    }*/
   // val number:MutableLiveData<Int> by lazy { MutableLiveData<Int>().also { it.value=0 } }//.also惰性加載初始化
    private val _number=MutableLiveData(0)//新版本提供非惰性加載的初始化
    val number: LiveData<Int>//外界可讀,寫
    get()=_number//設置這個中轉站
    fun modifyNumber(aNumber:Int){
        _number.value=_number.value?.plus(aNumber)//kotlin+改寫
    }//下劃線表內部私有 
    
}

2)回到AC,聲明ViewModel並且動態綁定控件顯示,修改

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
        viewModel.number.observe(this, Observer { textView.text=it.toString() })//it指value 這裏讀出來的number是不可修改,只讀的,只有get方法等於_number
        var number=0
        textView.text="0"
        buttonPlus.setOnClickListener{
            //打開發現裏面沒有未實現的方法 it提示指當前的view
            //textView.text=(++number).toString()
            viewModel.modifyNumber(1)
        }

        buttonMinus.setOnClickListener{
            //打開發現裏面沒有未實現的方法 it提示指當前的view
            //textView.text=(--number).toString()
            viewModel.modifyNumber(-1)
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章