我正在学习与 dart 绳,经过多年的Python。我对流有点困惑,如果有任何其他特定的解决方案,我可以使用我的特定情况。
我正在构建一个API驱动的应用程序,我需要动态填充ListView,而不需要等待所有HTTP调用完成。目前我使用的是一个Stream,它用yields作为返回值填充List:
就像这样:
var scraperList = List<Api> ();
Stream<List<Api>> get getFiles (String id) async* {
var res = await http.post('${baseUrl}/folder/list/{id}');
if (res.statusCode == 200) {
var jsonResult = jsonDecode(res.body);
jsonResult = jsonResult['content'];
List<dynamic> body = jsonResult;
List<Api> result = body.map((dynamic item) => ApiModel.apiFiles(item),).toList();
}
现在,这就是我迷失的地方,因为API充当了一种文件/文件夹存储,如果它们是“文件”,我需要产生结果,并使用文件夹的ID重复调用,并获得该文件夹中的“文件”,并继续这样做,直到我递归地获得每个文件夹中的所有文件。
关键是我想继续提供流,并在结果到达时获得结果,而不需要等待所有调用完成。
我现在不明白的是
// THIS IS THE PART I NEED TO UNDERSTAND YET
for (item in result){
if (item.type == 'file'){
yield filelist.add(0, item);}
else { I NEED TO MAKE A CALL AGAIN TO THIS FUNCTION TO GET THE FOLDER CONTENT
THE CALL AGAIN }
我如何迭代这个API,递归地获取每个文件夹中的所有文件,并继续提供该流?有没有更好的办法?在Python中,有很多方法可以在类之间共享列表等等,但我仍然对如何在Dart中动态实现这一点感到困惑。
2条答案
按热度按时间wljmcqd81#
你需要的是屈服和等待
检查这个
您也可以使用更多类型安全代码与
Either
来自dartz package7rfyedvj2#
虽然这个答案对你来说可能太晚了(3年后),但它仍然可以帮助其他人在未来遇到类似的问题。
Saed可能误解了您的意图,他提供的答案是将
Iterator
转换为Stream
,而不是迭代Stream
(可能相当于将Stream
转换为Iterator
)。据我所知,这件事可能办不到。但是有一个非常相似的解决方案--使用
StreamIterator
。它具有与Iterator
类似的接口。不同的是它的方法是异步的。例如,您应该使用await streamIterator.moveNext()
而不是iterator.moveNext()
。将
Stream
转换为StreamIterator
非常简单,只需使用final streamIterator = StreamIterator(yourStream);
即可。Iterator
和StreamIterator
之间可能很难共享相同的功能,因为Iterator
具有同步方法。目前,我通过将Iterable
转换为Stream
,然后将其转换为StreamIterator
来实现这一点:final streamIterator = StreamIterator(Stream.fromIterable(iterable));
请让我知道,如果你有任何更优雅的解决方案或任何意见,我的答案。