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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 22:10:23