Flutter 如何在Dart中迭代流
经过多年的巨蟒训练,我正在用飞镖学习绳子。 我对Streams有点困惑,如果有任何其他特定的解决方案,我可以用于我的具体案例 我正在构建一个API驱动的应用程序,我需要动态填充ListView,而无需等待所有HTTP调用完成。 目前,我正在使用一个流,该流以收益率作为回报填充列表: 大概是这样的:Flutter 如何在Dart中迭代流,flutter,dart,Flutter,Dart,经过多年的巨蟒训练,我正在用飞镖学习绳子。 我对Streams有点困惑,如果有任何其他特定的解决方案,我可以用于我的具体案例 我正在构建一个API驱动的应用程序,我需要动态填充ListView,而无需等待所有HTTP调用完成。 目前,我正在使用一个流,该流以收益率作为回报填充列表: 大概是这样的: var scraperList = List<Api> (); Stream<List<Api>> get getFiles (String id) async*
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,递归地获取每个文件夹中的所有文件,并继续向该流提供信息?
有更好的方法吗?
在python中,有很多方法可以跨类等共享列表,但我仍然对如何在Dart中动态实现这一点感到困惑。您需要的是收益*和等待 检查这个
import 'dart:async';
void main() {
final folder1 = Future.value({"a","b","c","d"});
final folder2 = Future.value({"a","b","c","d",folder1});
final folder3 = {"a","b","c","d",folder1,folder2}; //what you get initially
Stream printElement(list) async*{
for(dynamic element in list){
if(element is String){
yield element;
}else{
yield* printElement(
await(element)); //make your http call here for your nested folder
}
};
}
printElement(folder3).listen((element){
print(element);
});
}
您还可以将更安全的类型代码与一起使用
导入'dart:async';
导入“包:dartz/dartz.dart”;
类MyFile{
最终字符串文件名;
MyFile(this.fileName);
@凌驾
字符串toString(){
返回此文件名;
}
}
类MYFolder{
最后一个字符串folderName;
最终列表文件;//文件可以是文件,也可以是来自HTTP的未来文件夹
MYFolder(this.folderName,this.files);
@凌驾
字符串toString(){
返回this.folderName;
}
}
void main(){
//叶文件夹
最终文件夹=我的文件夹(“文件夹”),[右(我的文件(“a”))、右(我的文件(“a”)、右(我的文件(“a”)、右(我的文件(“a”))];
final folderb=MYFolder(“folderb”),[右(MyFile(“b”))、右(MyFile(“b”)、右(MyFile(“b”)、右(MyFile(“b”))];
final folderc=MYFolder(“folderc”),[Right(MyFile(“c”))、Right(MyFile(“c”)、Right(MyFile(“c”)、Right(MyFile(“c”))];
final folderd=MYFolder(“folderd”),[右(MyFile(“d”))、右(MyFile(“d”)、右(MyFile(“d”)、右(MyFile(“d”))];
//…福尔德拉
//-folderb
//-折叠1
//
//文件夹3-文件夹2
//…folderc
//-折叠
//
//--三点符号用于折叠列表中的元素,它只是填充列表的快捷方式
final folder1=Future.value(MYFolder(“folder1”,[…foldera.files,Left(Future.value(folderb))));
final folder2=Future.value(MYFolder(“folder2”,[…folderc.files,Left(Future.value(folderd))));
final folder3=MYFolder(“folder3”),[Left(Future.value(folder1)),Left(Future.value(folder2))];//最初得到的是什么
流printFilesIn(MYFolder文件夹)异步*{
打印(“当前文件夹为$folder”);
用于(文件夹.files中的任一文件){
如果(文件是正确的){
产生文件价值;
}否则{
产量*printFilesIn(
wait(文件如左所示).value);//在此处为嵌套文件夹进行http调用
}
};
}
printFilesIn(folder3),监听(print);
}
import 'dart:async';
void main() {
final folder1 = Future.value({"a","b","c","d"});
final folder2 = Future.value({"a","b","c","d",folder1});
final folder3 = {"a","b","c","d",folder1,folder2}; //what you get initially
Stream printElement(list) async*{
for(dynamic element in list){
if(element is String){
yield element;
}else{
yield* printElement(
await(element)); //make your http call here for your nested folder
}
};
}
printElement(folder3).listen((element){
print(element);
});
}
import 'dart:async';
import 'package:dartz/dartz.dart';
class MyFile{
final String fileName ;
MyFile(this.fileName);
@override
String toString() {
return this.fileName;
}
}
class MYFolder{
final String folderName;
final List<Either<Future<MYFolder>,MyFile>> files; //files can be Either file or Future of folder from HTTP
MYFolder(this.folderName, this.files);
@override
String toString() {
return this.folderName;
}
}
void main() {
//leaf folders
final foldera = MYFolder("foldera",[Right(MyFile("a")),Right(MyFile("a")),Right(MyFile("a")),Right(MyFile("a"))]);
final folderb = MYFolder("folderb",[Right(MyFile("b")),Right(MyFile("b")),Right(MyFile("b")),Right(MyFile("b"))]);
final folderc = MYFolder("folderc",[Right(MyFile("c")),Right(MyFile("c")),Right(MyFile("c")),Right(MyFile("c"))]);
final folderd = MYFolder("folderd",[Right(MyFile("d")),Right(MyFile("d")),Right(MyFile("d")),Right(MyFile("d"))]);
// ...foldera
// - folderb
// - folder1
//
//folder3 - folder2
// ... folderc
// - folderd
//
// --triple dot notation for folding elements in lists ,it is just a shortcut for populating lists
final folder1 = Future.value(MYFolder("folder1", [...foldera.files,Left(Future.value(folderb))]));
final folder2 = Future.value(MYFolder("folder2", [...folderc.files, Left(Future.value(folderd))]));
final folder3 = MYFolder("folder3",[Left(Future.value(folder1)),Left(Future.value(folder2))]); //what you get initially
Stream printFilesIn(MYFolder folder) async*{
print("Current folder is $folder");
for(Either file in folder.files){
if(file is Right){
yield file.value;
}else{
yield* printFilesIn(
await(file as Left).value); //make your http call here for your nested folder
}
};
}
printFilesIn(folder3).listen(print);
}