Flutter .obx 与 Rxn<T>的区别

1️⃣ .obs

  • 是 Rx 的简写,最常用的写法。

  • 一般用法:

复制代码

var count = 0.obs; // int 类型的响应式 var name = 'Jack'.obs; // String 类型 var user = UserModel(...).obs; // 非空对象

  • 特点:

    1. 变量 不能为 null,必须初始化一个非空值。

    2. .value 用来读写值。

示例:

复制代码

var user = UserModel(id:1, name:'Jack', email:'a@b.com', username:'jack', avatar:'').obs; // 修改 user.value.name = 'Tom'; user.value = newUser; // 访问 print(user.value.name);

  • 如果你想用 .obs,就必须给 user 一个初始值,哪怕是空对象(UserModel(id:0, name:'',...))。

2️⃣ Rxn<T>

  • Rxn = Rx nullable,可为空的响应式变量

  • 适合 初始值为空,后续可能赋值或者清空(未登录状态)

复制代码

var user = Rxn<UserModel>(); // 初始值为 null // 登录后赋值 user.value = UserModel(id:1, name:'Jack', email:'a@b.com', username:'jack', avatar:''); // 退出登录时清空 user.value = null; // UI 使用 Obx 自动刷新 Obx(() { if (user.value == null) { return Text('未登录'); } else { return Text('欢迎, ${user.value!.name}'); } });

  • 特点:

    1. 可以为空,不需要一开始就初始化。

    2. .value 访问方式和 .obs 一样。

    3. 非常适合"用户信息"这种未登录时为空、登录后赋值的场景。


3️⃣ 总结对比表

特性 .obs Rxn<T>
是否允许 null ❌ 不允许 ✅ 可以为空
是否必须初始化 ✅ 必须 ❌ 可以不初始化
使用方式 var x = value.obs; x.value var x = Rxn<T>(); x.value
场景示例 计数器、非空对象 用户信息、可选对象

💡 小结

  • 你的里用户信息用 Rxn<UserModel> 更合适,因为用户可能 未登录,user = null。

  • .obs 适合 一开始就有初始值 的变量,比如计数器、状态标志等。

相关推荐
2601_9498477516 小时前
Form-data 跨端三方库仓颉适配全流程
前端·javascript·flutter
大龄秃头程序员19 小时前
Flutter 中我为什么把 GetX 定位为高效率方案,而不是默认架构方案
flutter
传奇开心果编程21 小时前
组合优先开发范式:从汉字造字原理到声明式UI组件组合思想
android·flutter·ios·swiftui·移动开发·harmonyos·android jetpack
2501_944521591 天前
Ramda 跨端三方库仓颉适配全流程
开发语言·javascript·flutter·php
大龄秃头程序员2 天前
Flutter 架构里总被混淆的 IoC、DI、Service Locator,到底是什么关系?
flutter
事圆则缓2 天前
Flutter 与原生交互的最后一层:RTC 视频帧怎么走
flutter·音视频·实时音视频
2601_949847752 天前
jose 跨端三方库仓颉适配全流程
前端·javascript·flutter
2601_949970692 天前
msgpackr 跨端三方库仓颉适配全流程
前端·javascript·flutter
2601_949970692 天前
HumanizeDuration 跨端三方库仓颉适配全流程
前端·javascript·flutter
传奇开心果编程2 天前
【Flutter踩坑排雷】第3课:const 误用坑|const 错误使用引发 UI 异常与性能损耗
flutter·移动开发·跨平台·dart·编程语言理论·编程框架·声明式ui