Android Compose: `remember` 与 `ViewModel` 保存数据的优缺点对比 ...

打印 上一主题 下一主题

主题 968|帖子 968|积分 2904


在开发 Android 应用时,管理 UI 状态是一个不可避免的话题。Jetpack Compose 提供了两种常见的方式来保存和管理数据:remember 和 ViewModel。它们各有优缺点,实用于差异的场景。
本文将详细对比这两者在保存数据时的优缺点,资助你在实际开发中做出更合适的选择。
remember 和 ViewModel 的基本概念

在深入对比之前,我们先简单回顾一下这两者的基本概念。
remember
remember 是 Jetpack Compose 提供的一个工具,用于在 UI 组件重组(Recomposition)过程中缓存数据。当 UI 被重新绘制时,remember 可以保持一些数据稳定,避免不必要的重新盘算或数据丢失。
ViewModel
ViewModel 是 Android Architecture Components 中的一个组件,用于在配置更改(如屏幕旋转)时保存和管理 UI 相干的数据。ViewModel 通常与 LiveData 或 State 一起使用,它的生命周期跨越了 UI 组件的生命周期,能够确保数据在配置更改后不丢失。
remember 的优缺点

优点


  • 性能优化
    remember 可以缓存数据,避免每次 UI 组件重组时重新盘算或重新创建对象。对于一些不常常改变的数据,remember 可以显着提高应用的性能,减少不必要的盘算。
  • 简单易用
    使用 remember 保存数据非常简单,只需将数据放在 remember 的函数体内即可。没有复杂的生命周期管理,非常适合简单的场景。
  • 轻量级
    remember 不依赖于其他架构组件,不必要创建额外的类或管理额外的线程。它是纯粹的 Compose 办理方案。
缺点


  • 生命周期局限性
    remember 的作用范围仅限于当前 Composable 函数的生命周期。如果 Composable 被烧毁并重新创建,remember 会丢失数据。而 ViewModel 是计划为跨 Activity 或 Fragment 生命周期保存数据的,因此更适合恒久持久化的数据。
  • 实用场景有限
    remember 实用于一些简单的 UI 状态保存,通常不适合保存复杂的业务逻辑或者必要跨多个屏幕共享的数据。对于必要恒久保存或跨多个界面共享的数据,ViewModel 更为合适。
  • 无法处理配置变化
    如果屏幕旋转或其他配置发生变化,remember 中的数据会丢失。而 ViewModel 在这些情况下仍然能够保存数据。
ViewModel 的优缺点

优点


  • 跨组件生命周期保存数据
    ViewModel 计划用于在配置更改(如屏幕旋转)时保存数据。它的生命周期是与 Activity 或 Fragment 绑定的,因此实用于跨多个界面或组件的共享数据。
  • 支持复杂的业务逻辑和状态
    ViewModel 更适合保存和管理复杂的业务逻辑和状态。比方,保存从服务器获取的列表数据或用户设置等。
  • 与 Jetpack 架构组件兼容
    ViewModel 可以与 LiveData、State 等架构组件团结使用,方便处理异步数据流和 UI 状态的变化。
  • 在配置变化时不丢失数据
    由于 ViewModel 的生命周期是与 Activity 或 Fragment 绑定的,它在配置变化(如屏幕旋转)时不会丢失数据,能够保证数据的持续性。
缺点


  • 相对复杂
    ViewModel 的使用相对复杂,必要更多的代码和架构计划。如果只是必要在一个 Composable 函数内保存一些简单的数据,remember 会更简洁和高效。
  • 依赖于 ViewModel 相干框架
    使用 ViewModel 必要依赖 Jetpack 的架构组件,这意味着你必要引入额外的库和依赖,大概增加一些复杂性和包的大小。
  • 过分计划
    对于一些简单的 UI 状态,使用 ViewModel 大概显得有些过分计划。它更适合必要跨多个界面共享的数据,而对于局部组件的 UI 状态,remember 是一个更轻量的选择。
remember vs ViewModel:何时使用?

我们来总结一下,什么时候适合使用 remember,什么时候适合使用 ViewModel。
使用 remember 的场景:



  • 单个 UI 组件的简单状态管理:比方按钮点击次数、输入框内容等,数据只在当前 Composable 中使用,不必要跨多个屏幕共享。
  • 避免不必要的盘算:如果你有一些盘算比力昂贵的数据,remember 可以在界面重组时缓存该数据,避免每次重组时重新盘算。
  • 短生命周期的数据:如果数据只在某个特定 UI 组件生命周期内有效,使用 remember 更合适。
使用 ViewModel 的场景:



  • 跨屏幕共享数据:比方用户登录信息、购物车内容等必要在多个 Activity 或 Fragment 中共享的数据。
  • 必要恒久持久化的数据:比方网络请求结果、数据库数据等,即使发生配置变化(如屏幕旋转),数据也不应丢失。
  • 复杂的业务逻辑:如果你必要处理异步数据流、网络请求结果、或者涉及多个 UI 状态的管理,ViewModel 更加合适。
示例代码:remember 与 ViewModel 对比

我们通过一个简单的例子来展示如何使用 remember 和 ViewModel 保存数据。
使用 remember:

  1. @Composable
  2. fun RememberExample() {
  3.      val counter = remember { mutableStateOf(0) }
  4.      Column(
  5.          horizontalAlignment = Alignment.CenterHorizontally,
  6.          modifier = Modifier.padding(16.dp)
  7.      ) {
  8.          Text("Count: ${counter.value}")
  9.          Spacer(modifier = Modifier.height(8.dp))
  10.          Button(onClick = { counter.value++ }) {
  11.              Text("Increment")
  12.          }
  13.      }
  14. }
复制代码
使用 ViewModel:

  1. class CounterViewModel : ViewModel() {
  2.      private val _counter = mutableStateOf(0)
  3.      val counter: State<Int> = _counter
  4.      fun increment() {
  5.          _counter.value++
  6.      }
  7. }
  8. @Composable
  9. fun ViewModelExample(viewModel: CounterViewModel = viewModel()) {
  10.      Column(
  11.          horizontalAlignment = Alignment.CenterHorizontally,
  12.          modifier = Modifier.padding(16.dp)
  13.      ) {
  14.          Text("Count: ${viewModel.counter.value}")
  15.          Spacer(modifier = Modifier.height(8.dp))
  16.          Button(onClick = { viewModel.increment() }) {
  17.              Text("Increment")
  18.          }
  19.      }
  20. }
复制代码
结论

remember 和 ViewModel 都是非常有用的工具,但它们实用于差异的场景:


  • remember 实用于保存简单、局部的 UI 状态,尤其是必要优化性能或避免重复盘算时。
  • ViewModel 更适实用于跨多个界面共享数据,或者必要在配置变化后保存数据的场景。
在实际开发中,根据数据的生命周期和复杂度来选择合适的工具,能够让你的代码更加简洁高效。如果只是局部的 UI 状态,remember 是一个非常合适的选择;如果是跨界面或必要持久化的数据,ViewModel 会更适合。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

曂沅仴駦

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表