Flutter Mobx中如何将Drift的Stream<List>转为ObservableList?
解决Drift Stream转MobX ObservableList的问题
原代码的核心错误
- 返回类型不匹配:你定义的
streamTodos()返回ObservableList<TodoDrift>,但Drift的Stream是异步数据流,无法同步返回列表,这是根本矛盾。 - 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
相关产品推荐
相关产品推荐

