0
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 列表)。我希望在将新下载的文件添加到列表(媒体)之前,该函数不应返回值。这有可能吗?

4

1 回答 1

0

你可以更换

(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()返回 aFuture<T>仅在response.stream关闭时完成(即,在文件下载后)

于 2021-10-17T07:47:26.973 回答