MVVM常用易错点记录

一、在Fragment的onViewCreated中订阅Observer时。

1、使用this表示Observer的生命周期和Framgent绑定。

2、Fragment出栈时,并不会走到OnDestory方法,导致旧的订阅不会被清除。

3、重建Framgent会再次订阅Observer。

4、这样造成了Observer的重复订阅

总结:应当使用Fragment的viewLifecycleOwner订阅Observer,不应当使用this替代。

        data.observe(viewLifecycleOwner, {
            Log.e("fragment", "count: ${data.value}")
        })

二、在Activity或者Framgnet中使用Flow或者StateFlow

1、直接启用协程由于无法控制创建泄露的销毁,会导致内存泄露。

2、使用lifecycle-runtime-ktx 库提供的 lifecycleOwner.lifecycleScope,虽然开启的协程可以随着在Activity或者Framgnet的生命周期开始和结束,有效解决了内存泄露。但是会立即启动协程,无法在仅当UI处于前台时,才执行协程,造成资源浪费。

3、使用LaunchWhenStarted/LaunchWhenResumed 启动协程,有效结果了内存泄露。进入指定周期启用协程,进入stop周期之后便挂起了协程,折让节省了资源,但是挂起并不代表协程销毁,此时上游仍然在处理数据,虽然不会发射到界面, 因为资源浪费的问题未彻底解决。

4、lifecycle-runtime-ktx 提供了lifecyle.repeatOnLifecycle 进入指定生命周期启用协程,进入Stop之后销毁协程,重建时将会重新创建协程。这样便解决了以上所有问题。

viewLifecycleOwner.lifecycleScope.launch {
        viewLifecycleOwner.lifecycle.repeatOnLifecycle(STARTED) {
            viewMode.stateFlow.collect { ... }
        }
    }
lifecycleScope.launch {
     viewMode.stateFlow
          .flowWithLifecycle(this, Lifecycle.State.STARTED)
          .collect { ... }
 }

总结:使用repeatOnLifecycle或者flowWithLifecycle,后者是前者的封装。 

三、ViewModel初次数据请求

1、在onViewCreated中进行首次数据加载。这样当View的重建(横竖屏切换)会造成数据的重复请求。由于ViewModle的生命周期长于View,可以跨越View的生命周期,因此重复请求是对资源的浪费。

//在ViewModel的init中初始化数据,此时数据的初次加载是在ViewModel创建时完成。
class TasksViewModel: ViewModel() {

    private val _tasks = MutableLiveData<List<Task>>()
    val tasks: LiveData<List<Task>> = _uiState
    
    init {
        viewModelScope.launch {
            _tasks.value = withContext(Dispatchers.IO){
                TasksRepository.fetchTasks()
            }
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在WPF MVVM架构中,如果要实现餐历史记录功能,可以使用以下方法: 1. 创建一个数据模型类,用于表示记录的属性,例如订单号、顾客姓名、餐时间、总金额等。 2. 创建一个继承自ObservableCollection的订单集合,用于保存餐历史记录。 3. 在ViewModel中,创建一个名为OrderHistory的ObservableCollection属性,用于在View中展示餐历史记录。 4. 在ViewModel中,创建一个名为AddOrderHistory的方法,用于将新的记录添加到OrderHistory集合中。 5. 在View中,使用ListBox或DataGrid控件来展示OrderHistory集合中的餐历史记录。 6. 在View中,通过绑定命令的方式,将按钮的击事件与ViewModel中的AddOrderHistory方法进行绑定,以实现击按钮时添加记录的功能。 7. 在View中,使用TextBox等控件,通过绑定到ViewModel中的相应属性,来实现输入记录的功能。 8. 可以使用对话框或其他方式,来展示详细的餐历史记录信息,例如订单详情、菜品清单等。 9. 如果需要对餐历史记录进行搜索或过滤,可以在ViewModel中添加相应的方法或属性,用于实现这些功能。 通过上述步骤,我们可以在WPF MVVM架构中实现餐历史记录的功能。在View中展示餐历史记录,用户可以通过页面上的按钮来添加记录,也可以通过输入框来手动输入记录。同时,我们也提供了搜索、过滤等功能,使得用户可以更方便地管理和查找历史记录

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值