Flutter 如何在Dart中迭代流

Flutter 如何在Dart中迭代流,flutter,dart,Flutter,Dart,经过多年的巨蟒训练,我正在用飞镖学习绳子。 我对Streams有点困惑,如果有任何其他特定的解决方案,我可以用于我的具体案例 我正在构建一个API驱动的应用程序,我需要动态填充ListView,而无需等待所有HTTP调用完成。 目前,我正在使用一个流,该流以收益率作为回报填充列表: 大概是这样的: var scraperList = List<Api> (); Stream<List<Api>> get getFiles (String id) async*

经过多年的巨蟒训练,我正在用飞镖学习绳子。 我对Streams有点困惑,如果有任何其他特定的解决方案,我可以用于我的具体案例

我正在构建一个API驱动的应用程序,我需要动态填充ListView,而无需等待所有HTTP调用完成。 目前,我正在使用一个流,该流以收益率作为回报填充列表:

大概是这样的:

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);

}