【JetPack-二】LifeData自动更新学习笔记(Kotlin)

一.学习视频来源:

  1. https://www.bilibili.com/video/BV1sJ41127EMlongway777
  2. 模型图来源也全截取来自该Up的视频
    在这里插入图片描述

1.5 Kotlin演示

1. 建立ViewModel

class TimerWithLiveDataViewModel : ViewModel() {
    
    
    //将“秒钟”这个字段用MutableLiveData包装起来
    var currentSecond: MutableLiveData<Int>? = null
        get() {
    
    
            if (field == null) {
    
    
                field = MutableLiveData()
            }
            return field
        }

}

2. MainAC

  1. 惰性加载相应viewmodel
   lateinit var  timerWithLiveDataViewModel:TimerWithLiveDataViewModel
  1. 初始化并且添加观察者模式
        timerWithLiveDataViewModel = ViewModelProvider(this).get(
                TimerWithLiveDataViewModel::class.java
            )
        //通过LiveData.observe()实现对ViewModel中数据变化的观察
        timerWithLiveDataViewModel.currentSecond?.observe(this, Observer {
    
     second -> //收到回调后更新UI界面
            println("11111111111TIME:$second")
        })
  1. 按钮点击事件
   timerWithLiveDataViewModel.currentSecond?.value= 1;
  1. value值
    1) 若在原空基础上可空,自增则一直为空
    在这里插入图片描述
    2)直接赋值没问题
    在这里插入图片描述

二. 建立样例

1. 准备

  1. 上一个ViewModel中,每次更新ViewModel的number属性,都要再次手动设置界面更新
  2. res可使用Vector Assert矢量图标
    在这里插入图片描述
    在这里插入图片描述

2.核心代码

  1. 建立Livedata
    在这里插入图片描述

  2. provider导包
    在这里插入图片描述

  3. 以观察者模式监听,改变即作出反应
    在这里插入图片描述

  4. 首先创建一个类继承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)
    }//下划线规约内部只读
}
  1. 来到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>()
  1. 剩下的和之前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)
    }//下划线规约内部只读
}

猜你喜欢

转载自blog.csdn.net/qq_38304672/article/details/106622917