1️⃣ .obs
-
是 Rx 的简写,最常用的写法。
-
一般用法:
var count = 0.obs; // int 类型的响应式 var name = 'Jack'.obs; // String 类型 var user = UserModel(...).obs; // 非空对象
-
特点:
-
变量 不能为 null,必须初始化一个非空值。
-
.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}'); } });
-
特点:
-
可以为空,不需要一开始就初始化。
-
.value访问方式和.obs一样。 -
非常适合"用户信息"这种未登录时为空、登录后赋值的场景。
-
3️⃣ 总结对比表
| 特性 | .obs |
Rxn<T> |
|---|---|---|
| 是否允许 null | ❌ 不允许 | ✅ 可以为空 |
| 是否必须初始化 | ✅ 必须 | ❌ 可以不初始化 |
| 使用方式 | var x = value.obs; x.value |
var x = Rxn<T>(); x.value |
| 场景示例 | 计数器、非空对象 | 用户信息、可选对象 |
💡 小结
-
你的里用户信息用
Rxn<UserModel>更合适,因为用户可能 未登录,user = null。 -
.obs适合 一开始就有初始值 的变量,比如计数器、状态标志等。