【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)
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章