我是靠谱客的博主 秀丽猫咪,最近开发中收集的这篇文章主要介绍【JetPack-二】LifeData自动更新学习笔记(Kotlin)一.学习视频来源:1.5 Kotlin演示二. 建立样例三.完成LifeData后,若系统设置了不允许后台运行(挂起但没销毁),这里就需要写savedstate保存状态四:关于使用不对外开放的MutableLiveData和对外开放的 LiveData。,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
一.学习视频来源:
- https://www.bilibili.com/video/BV1sJ41127EMlongway777
- 模型图来源也全截取来自该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
- 惰性加载相应viewmodel
lateinit var timerWithLiveDataViewModel:TimerWithLiveDataViewModel
- 初始化并且添加观察者模式
timerWithLiveDataViewModel = ViewModelProvider(this).get(
TimerWithLiveDataViewModel::class.java
)
//通过LiveData.observe()实现对ViewModel中数据变化的观察
timerWithLiveDataViewModel.currentSecond?.observe(this, Observer { second -> //收到回调后更新UI界面
println("11111111111TIME:$second")
})
- 按钮点击事件
timerWithLiveDataViewModel.currentSecond?.value= 1;
- value值
1) 若在原空基础上可空,自增则一直为空
2)直接赋值没问题
二. 建立样例
1. 准备
- 上一个ViewModel中,每次更新ViewModel的number属性,都要再次手动设置界面更新
- res可使用Vector Assert矢量图标
2.核心代码
-
建立Livedata
-
provider导包
-
以观察者模式监听,改变即作出反应
-
首先创建一个类继承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)
}//下划线规约内部只读
}
四:关于使用不对外开放的MutableLiveData和对外开放的 LiveData。
private val _number=MutableLiveData(0)//新版本提供非惰性加载的初始化
val number: LiveData<Int>//外界可读,写
get()=_number//设置这个中转站
fun modifyNumber(aNumber:Int){
_number.value=_number.value?.plus(aNumber)//kotlin+改写
}//下划线表内部私有
- 查看源码
public class MutableLiveData<T> extends LiveData<T> {
/**
* Creates a MutableLiveData initialized with the given {@code value}.
*
* @param value initial value
*/
public MutableLiveData(T value) {
super(value);
}
/**
* Creates a MutableLiveData with no value assigned to it.
*/
public MutableLiveData() {
super();
}
@Override
public void postValue(T value) {
super.postValue(value);
}
@Override
public void setValue(T value) {
super.setValue(value);
}
}
最后
以上就是秀丽猫咪为你收集整理的【JetPack-二】LifeData自动更新学习笔记(Kotlin)一.学习视频来源:1.5 Kotlin演示二. 建立样例三.完成LifeData后,若系统设置了不允许后台运行(挂起但没销毁),这里就需要写savedstate保存状态四:关于使用不对外开放的MutableLiveData和对外开放的 LiveData。的全部内容,希望文章能够帮你解决【JetPack-二】LifeData自动更新学习笔记(Kotlin)一.学习视频来源:1.5 Kotlin演示二. 建立样例三.完成LifeData后,若系统设置了不允许后台运行(挂起但没销毁),这里就需要写savedstate保存状态四:关于使用不对外开放的MutableLiveData和对外开放的 LiveData。所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复