You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter Mobx中如何将Drift的Stream<List>转为ObservableList?

解决Drift Stream转MobX ObservableList的问题

原代码的核心错误

  1. 返回类型不匹配:你定义的streamTodos()返回ObservableList<TodoDrift>,但Drift的Stream是异步数据流,无法同步返回列表,这是根本矛盾。
  2. map操作逻辑错误:你在map里返回e.done != true(一个布尔值),导致Stream<List<TodoDrift>>被错误转换为Stream<bool>,类型完全不兼容。

两种正确实现方式

方式一:在Store中维护ObservableList,通过订阅Stream更新

适合需要在Store中持久化列表状态的场景,UI直接监听ObservableList的变化:

import 'package:mobx/mobx.dart';
import 'package:drift/drift.dart';

// 假设这是你的Store类
class TodoStore extends _TodoStore with _$TodoStore {
  final YourDriftDao todoDao; // 你的Drift DAO实例
  late StreamSubscription<List<TodoDrift>> _todoSubscription;

  @observable
  ObservableList<TodoDrift> todos = ObservableList<TodoDrift>.of([]);

  TodoStore(this.todoDao) {
    // 订阅Drift的Stream,实时更新ObservableList
    _todoSubscription = todoDao.watchTodos().listen((newTodos) {
      todos
        ..clear() // 先清空旧数据
        ..addAll(newTodos); // 添加新数据
    });
  }

  // 务必在Store销毁时取消订阅,避免内存泄漏
  void dispose() {
    _todoSubscription.cancel();
  }
}

方式二:将Drift Stream转为ObservableStream,在UI层处理

适合不需要在Store中维护列表状态,直接在UI层监听数据流的场景:

class TodoStore extends _TodoStore with _$TodoStore {
  final YourDriftDao todoDao;

  // 返回ObservableStream,供UI层监听
  ObservableStream<List<TodoDrift>> get streamTodos => todoDao.watchTodos().asObservable();

  // 如果需要过滤数据(比如只显示未完成的Todo),可以这样处理:
  ObservableStream<List<TodoDrift>> get streamUncompletedTodos => todoDao.watchTodos()
      .map((todos) => todos.where((todo) => !todo.done).toList())
      .asObservable();
}

在Flutter UI中使用StreamBuilder监听:

StreamBuilder<List<TodoDrift>>(
  stream: todoStore.streamTodos,
  builder: (context, snapshot) {
    if (snapshot.hasData) {
      final todos = snapshot.data!;
      // 若需要可转为ObservableList,直接用ObservableList.of(todos)即可
      return ListView.builder(
        itemCount: todos.length,
        itemBuilder: (context, index) => ListTile(
          title: Text(todos[index].title),
          leading: Checkbox(value: todos[index].done, onChanged: (_) {}),
        ),
      );
    }
    return const CircularProgressIndicator();
  },
)

内容的提问来源于stack exchange,提问作者user3795286

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 02:57:54