如何编写方法修改Stream<U>后返回Stream<T>并实现类型转换与过滤
错误根源
async*方法中直接yield整个Stream对象语法错误,转发Stream元素需使用yield*关键字- 你为
map传入了async函数,导致转换后得到的是Stream<Future<Submission?>>,和预期返回的Stream<Submission>类型完全不匹配 - 没有处理转换过滤后返回null的场景,无法满足返回值的非空要求
最优实现方案
使用await for遍历原始Stream,逻辑最清晰,容易调试:
Stream<Submission> getSavedPosts({int limit = 20}) async* { await for (final UserContent userContent in _me!.saved(limit: limit)) { try { final Submission sub = await _populateUserContent(userContent); if (_filterPost(sub)) { yield sub; } } catch (err) { print(err); } } }
链式操作写法
如果你更习惯Stream的链式调用风格,可使用asyncMap+whereType实现:
Stream<Submission> getSavedPosts({int limit = 20}) { return _me!.saved(limit: limit) .asyncMap((UserContent userContent) async { try { final Submission sub = await _populateUserContent(userContent); return _filterPost(sub) ? sub : null; } catch (err) { print(err); return null; } }) .whereType<Submission>(); }
内容的提问来源于stack exchange,提问作者Remo Herzog
相关产品推荐
相关产品推荐

