LIVO 下一代 Flutter 状态管理
Source: Dev.to
Flutter 很棒,但状态管理很快就会变得混乱。你可能在小项目中使用过 setState,在更大的应用中使用 Provider、Riverpod 或 BLoC——但每种方案都有各自的取舍。
Note: This story was originally about
reactive_orm, which is now deprecated. Its evolution is now called LIVO. LIVO continues its reactive object‑relationship state‑management approach with improved naming, documentation, and long‑term support.
什么是 LIVO?
Enter LIVO:一个轻量级、响应式的 ORM 风格状态管理库,适用于 Flutter。
它让你的 UI 在模型属性变化时自动响应——无需 streams、ChangeNotifier 或繁琐的样板代码。
使用 LIVO,您将获得
- 对象级和字段级的响应式
- 嵌套和共享模型
- 多对一和多对多关系
- 最少的样板代码,纯 Dart 模型
LIVO in action
- Object‑wise: 更新任意字段并重建整个部件
- Field‑wise: 仅为选定字段重建部件
- Many → One: 多个模型向单个观察者提供数据
- Many ↔ Many: 共享模型在多个父级之间反映
入门指南
将 LIVO 添加到你的项目中:
dependencies:
livo: ^
1️⃣ 创建响应式模型
import 'package:livo/livo.dart';
class Task extends ReactiveModel {
String _title;
bool _completed = false;
String _status = "Idle";
Task({required String title}) : _title = title;
String get title => _title;
set title(String value) {
if (_title != value) {
_title = value;
notifyListeners(#title); // ✅ Symbol‑based
}
}
bool get completed => _completed;
set completed(bool value) {
if (_completed != value) {
_completed = value;
notifyListeners(#completed);
}
}
String get status => _status;
set status(String value) {
if (_status != value) {
_status = value;
notifyListeners(#status);
}
}
}
✅ 这只是普通的 Dart。LIVO 会在字段变化时自动通知小部件。
2️⃣ 对象级响应式
final objectWise = Task(title: "Object-wise Reactivity");
ReactiveBuilder(
model: objectWise,
builder: (task) {
return ListTile(
title: Text(task.title),
subtitle: Text(task.status),
trailing: Checkbox(
value: task.completed,
onChanged: (v) => task.completed = v!,
),
);
},
);
勾选复选框会触发整个小部件的重建。
3️⃣ 字段级响应式(优化)
final fieldWise = Task(title: "Field-wise Reactivity");
ReactiveBuilder(
model: fieldWise,
fields: [#completed, #status],
builder: (task) {
return ListTile(
title: Text(task.title),
subtitle: Text(task.status),
trailing: Checkbox(
value: task.completed,
onChanged: (v) => task.completed = v!,
),
);
},
);
✅ 仅当 completed 或 status 发生变化时才会重建小部件;其他字段的更改将被忽略。
4️⃣ 多对一(聚合)
class Dashboard extends ReactiveModel {
final List sources;
Dashboard(this.sources) {
for (final task in sources) {
addNested(task); // listen to many
}
}
}
final manyA = Task(title: "Task A");
final manyB = Task(title: "Task B");
final dashboard = Dashboard([manyA, manyB]);
ReactiveBuilder(
model: dashboard,
builder: () => Column(
children: [
Text("A: ${manyA.completed}"),
Text("B: ${manyB.completed}"),
],
),
);
更新 manyA 或 manyB 会自动重建 dashboard 小部件。
5️⃣ 多对多(共享模型)
class Group extends ReactiveModel {
final String name;
final List tasks;
Group({required this.name, required this.tasks}) {
for (final task in tasks) addNested(task);
}
}
final group1 = Group(name: "Group 1", tasks: [objectWise, fieldWise]);
final group2 = Group(name: "Group 2", tasks: [fieldWise, manyA]);
ReactiveBuilder(
model: group1,
builder: (g) => Column(
children: g.tasks
.map((t) => Text("• ${t.title} → ${t.completed}"))
.toList(),
),
);
✅ 更新任务后会自动在所有包含该任务的组中反映出来。
LIVO 的工作原理
- 模型继承自
ReactiveModel - 当字段值变化时,字段的 setter 会调用
notifyListeners(#field) ReactiveBuilder小部件可以监听整个对象或特定字段- 嵌套模型会自动向上级传播更改
- 没有流(streams),也不需要手动连接。所有更新都安全且高效。
为什么选择 LIVO
- 使用最少的样板代码的干净 Dart 模型
- 细粒度的响应式,实现性能优化
- 类 ORM 的思维模型,便于应用设计
- 对单字段、嵌套模型或共享模型都能无缝工作
链接
- Pub 包: LIVO
- GitHub 仓库: github.com/PravinKunnure/livo
提示给读者
从小开始:使用对象级响应式进行快速原型开发。随着应用的增长,切换到字段级或嵌套模型以提升效率。
LIVO 让 Flutter 状态管理直观且有趣——且不牺牲性能。