【问题标题】:Waiting for a stream to complete before the function returns a value在函数返回值之前等待流完成
【发布时间】:2021-12-02 20:12:17
【问题描述】:
Future<List<Media>> getVideo(var _client, var _videofolder) async {
  final pathContext = path.Context(style: path.Style.windows);
  var tempDir = await getTemporaryDirectory();
  String tempPath = tempDir.path;

  print(tempPath);

  final filePath = pathContext.join(tempPath, _videofolder[videoNumber]["name"]);

  if (await io.File(filePath).exists() == false) {
    print("file does not exist yet");
    drive
    .fileDownloadFuntion(_videofolder[videoNumber]["id"], _client).then((response) {
      print("file downloaded");
      Uint8List byteList;
      final bytesBuilder = BytesBuilder();
      (response).stream.listen((data) {
        bytesBuilder.add(data);
      }).onDone(() {
        byteList = bytesBuilder.toBytes();
        final saveFile = io.File(filePath);
        saveFile.writeAsBytes(byteList.toList());
        print("File saved at ${saveFile.path}");

        if (io.File(filePath).exists() == true)
          medias.add(
            Media.file(io.File(filePath.replaceAll('"', ''))),
          );
      });
    });
  } 
  else{
    print("file exists");
    if (await io.File(filePath).exists() == true)
      medias.add(
        Media.file(io.File(filePath.replaceAll('"', ''))),
      );
  }
  videoNumber++;
  return medias;
}

以上代码在本地存储中查找视频文件。如果文件不存在,它会继续从谷歌驱动器下载它。然后在将文件转换为 8 位无符号整数列表后保存下载的文件。

上述代码的问题在于它在流完成之前返回了未更改的变量 medias(Media 列表)。 我希望在将新下载的文件添加到列表(媒体)之前,该函数不应返回值。这有可能吗?

【问题讨论】:

    标签: flutter dart dart-async flutter-desktop dart-stream


    【解决方案1】:

    你可以替换

    (response).stream.listen((data) {
            bytesBuilder.add(data);
          }).onDone(() {
            byteList = bytesBuilder.toBytes();
            final saveFile = io.File(filePath);
            saveFile.writeAsBytes(byteList.toList());
            print("File saved at ${saveFile.path}");
    
            if (io.File(filePath).exists() == true)
              medias.add(
                Media.file(io.File(filePath.replaceAll('"', ''))),
              );
          });
    

    List<Uint8List> byteList = await response.stream.toList(); 
    await io.File(filePath).writeAsBytes(byteList);
    if (io.File(filePath).exists() == true){
       medias.add(Media.file(io.File(filePath.replaceAll('"', ''))));
    }
    

    response.stream.toList() 返回一个 Future&lt;T&gt;,只有在 response.stream 关闭时(即文件下载后)才会完成

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-08
      • 2021-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-17
      • 1970-01-01
      相关资源
      最近更新 更多