文档管理中心
|

HarmonyOS 5

伙伴SDK

LiveData

LiveData

?: 表达式不为空就返回左边,为空返回右边

前面是手动去更新界面,如果在ViewModel中有子线程耗时逻辑,那么点击后更新的数据可能不变

绝大多数情况下,LiveData和ViewModel结合使用,可以包装任何类型的数据,然后在Activity中去观察这个数据,如果发生变化,就可以主动把数据变化通知给Activity

收起
自动换行
深色代码主题
复制
class MainViewModel(countReserved:Int) : ViewModel() {

    var counter=MutableLiveData<Int>()//把counter修改为MutabelLiveData对象,这是一种可变的LiveData,他有三种用法:getValue(),setValue()(只能在主线程中调用),postValue()(在非主线程中调用给LiveData设置数据)
    init{
        counter.value=countReserved
    }
    fun plusOne(){
        val count=counter.value?:0
        counter.value=count+1
    }
    fun clear(){
        counter.value=0
    }
}
收起
自动换行
深色代码主题
复制
class MainActivity : AppCompatActivity() {
    lateinit var viewModel:MainViewModel
    lateinit var binding:ActivityMainBinding
    lateinit var sp:SharedPreferences
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
binding=ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
       
        sp=getPreferences(Context.MODE_PRIVATE)
        val countReserved=sp.getInt("count_reserved",0)
        viewModel=ViewModelProvider(this,MainViewModelFactory(countReserved))
            .get(MainViewModel::class.java)
        binding.plusOneBtn.setOnClickListener{
           viewModel.plusOne()
        }
        binding.clearBtn.setOnClickListener {
            viewModel.clear()
        }
        //observe观察数据变化,第一个参数是LifecycleOwner,继承了AppCompatActivity的Activity,或者是继承自androidx .fragment.app.Fragment的Fragment都是LifecycleOwner,可以直接传this,第二个参数是Observer接口,counter数据发生变化就会回调到这里,在这进行界面更新
       viewModel.counter.observe(this, Observer{
           count->binding.infoText.text=count.toString()
       })

    }

    override fun onPause() {
        super.onPause()
        sp.edit {
            putInt("count_reserved",viewModel.counter.value?:0)
        }
    }

但是这样会把counter这个可变的LiveData暴露给外部,可能被设置修改数据,

收起
自动换行
深色代码主题
复制
class MainViewModel(countReserved:Int) : ViewModel() {
val counter: LiveData<Int>//把counter声明为不可变的LiveData
    get()=_counter//给get设置返回_counter, 这样只能调用counter获得_counter,但是不能给counter设置数据
    //每次外部代码尝试读取 counter 属性的值时,get() 方法会被调用,并返回 _counter 的值。
    private val _counter=MutableLiveData<Int>()//private,并且改名为 _counter
    init{
        _counter.value=countReserved
    }
    fun plusOne(){
        val count=_counter.value?:0
        _counter.value=count+1
    }
    fun clear(){
        _counter.value=0
    }
}

点赞
收藏
回复
分享
举报
浏览53 发布于2025-08-12 02:10广东
全部评论
最多点赞
最新发布
最早发布
写回答
新增插入模板功能
一键使用模板,快速填写内容,轻松发帖~
知道了
  • 为了保障您的信息安全,请勿上传您的敏感个人信息(如您的密码等信息)和您的敏感资产信息(如关键源代码、签名私钥、调试安装包、业务日志等信息),且您需自行承担由此产生的信息泄露等安全风险。
  • 如您发布的内容为转载内容,请注明内容来源。

我要发帖子

了解社区公约,与您携手共创和谐专业的开发者社区。