Getx新手大陆之 自动更新Rx<T>、 .obs 、RxList<T>和手动更新update

放在前面

  • 在你完全确定使用的变量类型,并且需要快速开发时,.obs是一个非常便捷的选择。
  • 当你处理的是列表数据,并且需要对这些数据的增删查改做出响应时,RxList<T>是最佳选择。
  • 在需要类型安全或者处理复杂对象时,推荐使用Rx<T>,它既保证了类型安全,又提供了丰富的API支持。

一、自动更新:GetX中RxList、Rx([])、.obs的区别和用法

在GetX中处理状态管理时,我们通常会用到Rx<T>.obs以及RxList<T>等几种响应式变量。理解它们的区别和使用场景对于高效利用GetX至关重要。

  • RxList是响应式编程中的一个响应式列表,用于管理列表数据的状态。当你需要监听列表的任何改变(添加、删除项等)并自动更新UI时,可以使用RxList`。

  • Obx 是一个Widget,用于创建一个自动反应式的UI部分。当你在Obx中使用的任何Rx类型变量(包括RxListRxRxInt等)发生变化时,Obx会自动重建其子Widget。

概述

  1. Rx :

    • 是一个泛型类,用于将基本数据类型、集合或自定义对象转换为响应式变量。
    • 它提供了类型安全,因为你必须指定变量的类型。
    • 适用于需要明确变量类型的场景,有助于提高代码的可读性和健壮性。
  2. .obs:

    • 是一个扩展方法,可以将几乎任何Dart对象转换成响应式对象。
    • 它非常灵活,但有时可能会牺牲类型安全。
    • 适用于快速原型开发或者当变量的类型非常明确,且不易出错的情况。
  3. RxList :

    • 是专门用于创建响应式列表的类。
    • 它提供了列表操作的响应式版本,如添加、删除元素等,UI会自动响应这些变化。
    • 特别适用于当UI需要根据列表数据的变化动态更新时。

核心区别

  • 类型安全:

    • Rx<T>提供了最高的类型安全。
    • .obs在一些情况下可能会牺牲类型安全。
  • 使用便利性:

    • .obs在快速开发中非常方便,简短的代码即可实现响应式。
    • Rx<T>RxList<T>虽然需要更明确的类型声明,但提供了更丰富的API和类型安全。
  • 适用场景:

    • 如果你处理的是列表并且需要对列表的变动做出响应,使用RxList<T>
    • 如果你需要保证类型安全或者是处理自定义对象,使用Rx<T>
    • 对于简单的数据类型或者需要快速开发的场景,使用.obs

Rx

Rx<T>允许你将一个变量变为响应式的,同时保留其类型信息。这意味着如果你尝试将错误类型的值赋给它,编译器会立即报错,从而避免了运行时错误。

ini 复制代码
dartCopy code
final name = Rx<String>('John Doe');
final age = Rx<int>(30);

// 更新方式
name.value = 'Jane Doe';
age.value = 31;

// 使用方式
Obx(() => Text('${name.value} is ${age.value} years old'));

.obs

使用.obs可以快速将任何类型的变量转换为响应式变量,但是它不提供类型安全。这种方式特别适合原型开发或者当你完全确定变量类型时使用。

ini 复制代码
dartCopy code
final score = 0.obs;

// 更新方式
score.value = 10;

// 使用方式
Obx(() => Text('Score: ${score.value}'));

RxList

RxList<T>是专为列表设计的响应式类。当列表的内容发生变化时,依赖于该列表的UI会自动更新。

less 复制代码
dartCopy code
final names = RxList<String>(['John', 'Doe']);

// 添加项
names.add('Jane');

// 使用方式
Obx(() => Column(children: names.map((name) => Text(name)).toList()));

结论

  • 在你完全确定使用的变量类型,并且需要快速开发时,.obs是一个非常便捷的选择。
  • 当你处理的是列表数据,并且需要对这些数据的增删查改做出响应时,RxList<T>是最佳选择。
  • 在需要类型安全或者处理复杂对象时,推荐使用Rx<T>,它既保证了类型安全,又提供了丰富的API支持。

二、手动更新 update

在GetX中,除了使用响应式变量(如Rx<T>, .obs, RxList<T>)之外,还可以通过update()方法手动触发UI更新。理解update()与响应式变量之间的区别以及它们各自的使用场景是非常重要的。直接update是手动全部更新,update指定id就是指定id更新。

update()方法

update()方法是一个手动触发UI更新的机制。当你调用一个控制器的update()方法时,所有使用该控制器并且通过GetBuilderObx监听的UI部件都会重新构建。

使用场景

  • 当你的变量不是响应式的,或者你选择不使用响应式状态管理时。
  • 当你想要控制具体哪部分UI在数据变化时应该被更新,而不是自动更新所有依赖于该状态的UI部件。

基本用法 update

scala 复制代码
class MyController extends GetxController {
  var count = 0;

  void increment() {
    count++;
    update(); // 通知UI更新
  }
}

在UI部分,使用GetBuilder

less 复制代码
GetBuilder<MyController>(
  init: MyController(),
  builder: (controller) => Text('${controller.count}'),
)

update()与指定ID的区别

  • 使用update()无参数调用时,它会更新所有使用该控制器的UI部件。
  • 你可以通过传递一个或多个ID给update()方法,只更新对应ID的UI部件,这提供了更细粒度的控制。
css 复制代码
update(['myUniqueId']);

然后,在UI部件中指定相同的ID:

less 复制代码
GetBuilder<MyController>(
  id: 'myUniqueId',
  builder: (controller) => Text('${controller.count}'),
)

与响应式变量的区别

  • 响应式变量(Rx<T>, .obs, RxList<T> 提供了一种自动的、声明式的状态管理方式。一旦响应式变量的值发生变化,所有依赖该变量的UI都会自动更新。这种方式简化了状态管理,使得开发者不需要显式调用任何方法来通知UI更新。
  • update()方法 提供了一种命令式的状态管理方式。你需要手动调用update()来通知UI需要重建。这种方式给予了开发者更精细的控制权,但同时也增加了管理状态的复杂度。

选择使用update还是响应式变量

  • 如果你倾向于使用声明式编程,喜欢简洁的代码,并且想要框架帮你自动处理状态到UI的更新,那么使用响应式变量会是一个更好的选择。
  • 如果你需要更精细的控制UI更新的时机,或者在某些特定情况下,你的变量不便于转换为响应式变量,那么使用update()可能更适合。
  • 实际开发中,update()和响应式变量往往会根据具体情况混合使用,以达到最佳的开发效率和性能。

总之,GetX提供了灵活的状态管理方案,让开发者可以根据自己的需求和偏好选择最合适的方式。了解和掌握这些工具的使用,能够帮助你更高效地开发Flutter应用。

不点赞,你代码迟早出bug。都看到这里了。

相关推荐
Redstone Monstrosity5 分钟前
字节二面
前端·面试
东方翱翔13 分钟前
CSS的三种基本选择器
前端·css
Fan_web35 分钟前
JavaScript高级——闭包应用-自定义js模块
开发语言·前端·javascript·css·html
yanglamei196243 分钟前
基于GIKT深度知识追踪模型的习题推荐系统源代码+数据库+使用说明,后端采用flask,前端采用vue
前端·数据库·flask
千穹凌帝44 分钟前
SpinalHDL之结构(二)
开发语言·前端·fpga开发
dot.Net安全矩阵1 小时前
.NET内网实战:通过命令行解密Web.config
前端·学习·安全·web安全·矩阵·.net
Hellc0071 小时前
MacOS升级ruby版本
前端·macos·ruby
前端西瓜哥1 小时前
贝塞尔曲线算法:求贝塞尔曲线和直线的交点
前端·算法
又写了一天BUG1 小时前
npm install安装缓慢及npm更换源
前端·npm·node.js
cc蒲公英1 小时前
Vue2+vue-office/excel 实现在线加载Excel文件预览
前端·vue.js·excel