flutter - Flutter异步/等待在两个Firebase功能之间不起作用

标签 flutter dart

我正在尝试调用仅在另一个函数在Firebase Storage中返回文件的url但异步等待不起作用且无论如何都调用第二个函数而第二个函数仍未调用时才必须持久化对象的Cloud Firestore函数完成!!!

      await schoolProfileProvider.uploadSchoolProfileAvatar(data).then( (data) {
          schoolProfileProvider.addSchoolProfile(data);
        });
        print('PROFILE ADDED');

Future<SchoolProfileData> uploadSchoolProfileAvatar(SchoolProfileData data) async {
    List<File> avatars = [];
    data.childrenDetails.forEach((child) {
      avatars.add(File(child.childImage));
    });
    try {
       await _api.uploadFilesToStorage(avatars, 'image', 'png').then((urls) {
        for (var i = 0; i < urls.length; i++) {
          data.childrenDetails[i].childImage = urls[i];
          print('ADD ' + data.childrenDetails[i].childImage);
        }
      });
    } on Exception catch (e) {
      print(e.toString());
    }
    return data;
  }

  T cast<T>(x) => x is T ? x : null;
  Future<List<String>> uploadFilesToStorage(List<File> files, String type, String extension) async {
    final urls = <Future<String>>[];
    files.forEach((file) async {
      StorageReference storageRef = storage.ref().child(file.path);
      final StorageTaskSnapshot downloadUrl =
      (await storageRef
          .putFile(file, StorageMetadata(contentType: type + '/' + extension))
          .onComplete);
       await downloadUrl.ref.getDownloadURL().then((url) {
        urls.add(cast<Future<String>>(url));
        print('URL for file ${file.path} = ${url.toString()}');
      });
    });
    print ('urls returned');
    return Future.wait(urls);
  }

  Future addSchoolProfile(SchoolProfileData data) async{
    var result;
    try {
      result = await _api.addDocument(data.toJson());
    } on Exception catch(e) {
      print (e.toString());
    }
    return result;
  }

最佳答案

我设法通过减少嵌套函数并使等待的downloadUrl.ref.getDownloadURL()作为被调用者函数中返回的最后一条指令,完成了 uploadFilesToStorage 之后,使事情正常运行并执行 addSchoolProfile
请找到对谁感兴趣的代码:

call 者:

  schoolProfileProvider.addSchoolProfileAndUploadAvatar(data);

  Future addSchoolProfileAndUploadAvatar(SchoolProfileData data) async {
    List<File> avatars = [];
    data.childrenDetails.forEach((child) {
      avatars.add(File(child.childImage));
    });
    try {
         for (int i=0;i<avatars.length;i++){
           await _api.uploadFileToStorageAndGetUrl(avatars[i], 'image', 'png').then((url) {
             print('URL for file ${avatars[i].path} = ${url.toString()}');
             data.childrenDetails[i].childImage = url;
             print('ADD ' + data.childrenDetails[i].childImage);
           });
         }
         _api.addDocument(data.toJson()) ; // Add document in Google Firebase after setting the avatar url
    } on Exception catch (e) {
      print(e.toString());
    }
  }

被叫方:
Future <String>  uploadFileToStorageAndGetUrl(File file,String type, String extension) async{
    StorageReference storageRef = storage.ref().child(file.path);
    final StorageTaskSnapshot downloadUrl =
    (await storageRef
            .putFile(file, StorageMetadata(contentType: type + '/' + extension))
    .onComplete);
    return await downloadUrl.ref.getDownloadURL(); // return the url of the file in Google Storage
  }

关于flutter - Flutter异步/等待在两个Firebase功能之间不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59572931/

相关文章:

android-studio - 错误 : unable to locate asset entry in pubspec. yaml: "assets/CupertinoIcons.ttf"

flutter - 如何使用 Flutter Navigator 推送多条路由

dart - 具有 contenteditable ="true"的元素的属性绑定(bind)

xamarin - Flutter 中的 Xamarin MessagingCenter 相当于什么?

ios - 如何将变量从 flutter 传递到 native objective-c

Flutter:要做多少个 block ?寻找建筑建议。我是 BloC 新手,计划编写一个应用程序

google-maps - 在 initState() 中调用时, flutter 的谷歌地图自定义图标不显示

dart - 如何在抖动中制作带有水印的图像?

Flutter - 调整网络图像大小

android - 必须为文本窗口小部件提供非空字符串。 'package:flutter/src/widgets/text.dart':断言失败:第360行pos 10: 'data != null'