LIVO 下一代 Flutter 状态管理

发布: (2026年2月23日 GMT+8 18:47)
5 分钟阅读
原文: Dev.to

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!,
      ),
    );
  },
);

✅ 仅当 completedstatus 发生变化时才会重建小部件;其他字段的更改将被忽略。

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}"),
    ],
  ),
);

更新 manyAmanyB 会自动重建 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 的思维模型,便于应用设计
  • 对单字段、嵌套模型或共享模型都能无缝工作

链接

提示给读者

从小开始:使用对象级响应式进行快速原型开发。随着应用的增长,切换到字段级或嵌套模型以提升效率。

LIVO 让 Flutter 状态管理直观且有趣——且不牺牲性能。

0 浏览
Back to Blog

相关文章

阅读更多 »