在 Dart 中,通过仅存在于回调内部的 collection/list `yield` 的最佳方法是什么?

What is the best way to `yield` over a collection/list that only exists inside of a callback, in Dart?

我有一个方法 (_all),里面有一个回调 (_runInTxn)。回调获取我想要 yield 的列表 (rs) 和 return 通过 _all 的流。但是,回调未标记为 async*(但该方法标记为 async*)。

通过仅存在于回调内部的 collection/list yield 的最佳方法是什么?

以下是正确有效的示例:

  Stream<String> _all() async* {
    var sql = 'SELECT id,value FROM $storeName';
    SqlResultSet resultSet;

    await _runInTxn((txn) {
      txn.executeSql(sql, [], (txn, rs) {
        resultSet = rs;
      });
    });

    for (var i = 0; i < resultSet.rows.length; ++i) {
      var row = resultSet.rows.item(i);
      yield row['value'];
    }
  }

我很好奇是否有更好的方法来编写这段代码,这样我就可以避免空 resultSet。我真的很想在 executeSql 声明中包含我的 yield 声明。我可以做一个 "non-local yield" 吗?

关于在 Future.forEach() 中使用 yield 也有类似的讨论,据我所知,答案是不支持(还找不到讨论)。

我想如果没有异步会更容易*

Stream<String> _all() {
  var sql = 'SELECT id,value FROM $storeName';
  var sc = new StreamController<String>();

  _runInTxn((txn) {
    txn.executeSql(sql, [], (txn, rs) {
      rs.rows.forEach((row) => sc.add(row['value']));
    });
  }).then((_) => sc.close());

  return sc.stream;
}

尝试 DartPad