yield*表达式类型不兼容:Flutter中Future转Stream遇类型错误
问题描述
这是一个同类问题,但我在将Future转换为Stream的过程中没找到合适的解决方案。
我的Future函数:
Future<List<Message>> messageList() async { final List<Map<String, dynamic>> maps = await _db!.query('Test',orderBy: 'timestamp DESC',); return List.generate(maps.length, (i) { return Message( inboxId: maps[i]['inboxId'], messageId: maps[i]['messageId'], fromId: maps[i]['fromId'] ); } ); }
我的Stream函数:
Stream<List<Message>> streamMessage() async* { final List<Map<String, dynamic>> maps = await _db!.query('Test',orderBy: 'timestamp DESC',); List<Message>list=List.generate(maps.length, (i) { return Message( inboxId: maps[i]['inboxId'], messageId: maps[i]['messageId'], fromId: maps[i]['fromId'] ); } ); yield* list;//// 这里IDE报红错误 }
报错信息(中文翻译):
yield*表达式推断出的类型'List'必须能赋值给'Stream<List >'。
错误原因与解决方法
yield*的作用是委托给另一个Stream,但你传入的list是List<Message>类型,并非Stream,因此触发类型不匹配错误。如果只是想把单次查询到的消息列表作为Stream的一个事件发送,直接用yield即可:
修改后的Stream函数:
Stream<List<Message>> streamMessage() async* { final List<Map<String, dynamic>> maps = await _db!.query('Test', orderBy: 'timestamp DESC',); List<Message> list = List.generate(maps.length, (i) { return Message( inboxId: maps[i]['inboxId'], messageId: maps[i]['messageId'], fromId: maps[i]['fromId'] ); }); yield list; // 直接将List<Message>作为Stream的单个事件发送 }
如果需要Stream监听数据库变化(数据更新时自动推送新列表),上面的写法只能发送一次初始数据。这种场景下可以借助数据库的变更监听API(比如sqflite的onDatabaseChange),或者定期轮询:
Stream<List<Message>> streamMessage() async* { // 先发送初始数据 yield await messageList(); // 监听Test表的数据库变更,有更新时重新查询并推送 await for (final change in _db!.onDatabaseChange) { if (change.table == 'Test') { yield await messageList(); } } }
内容的提问来源于stack exchange,提问作者tailor
相关产品推荐
相关产品推荐

