Future dart/flutter 中的返回值

Posted

技术标签:

【中文标题】Future dart/flutter 中的返回值【英文标题】:Return value in Future dart/flutter 【发布时间】:2020-01-05 08:00:41 【问题描述】:

为什么返回值总是空?

 _repository.addUpdateWorkOrder(workOrder).listen((ref) 
    image.id = ref.documentID;
    _repository
        .getImageDownloadUrl(ref.documentID, image.imagePath)
        .then((val) 
      print('The value of the input is: $val');
    );
  );

存储库

@override
  Future<List<String>> getImageDownloadUrl(
      String id, List<Asset> imagePath) async 
    Future.wait(imagePath.map((Asset asset) async 
      ByteData byteData = await asset.requestOriginal();
      List<int> imageData = byteData.buffer.asUint8List();

      var dateTime = new DateTime.now();
      final StorageReference firebaseStorageRef = FirebaseStorage.instance
          .ref()
          .child('images/' + id + '/' + dateTime.toString() + ' .jpg');

      return firebaseStorageRef.putData(imageData).onComplete.then(
          (uploadTask) =>
              uploadTask.ref.getDownloadURL().then((url) => url.toString()));
    ));
  

输出

I/flutter(22901):输入的值为:null

【问题讨论】:

uploadTask 也为空? @PeterHaddad 没有。当我调试时,我可以看到 url 上有值。 @PeterHaddad 在我调试时,它会先运行print('The value of the input is: $val');,然后只运行getImageDownloadUrl 方法... 您不能从 then 方法返回值,您应该改用 await 并将结果分配给新变量,然后再次使用它。我所说的只是getImageDownloadUrl 函数中的代码。 @JohnJoe,请检查这个gist 是为你编码的,并告诉我它是否有效或发生了什么? 【参考方案1】:

当我们在 cmets 中讨论问题时,我们终于找到了一个解决方案,因为我们编辑了 getImageDownloadUrl 函数,就像在这个 gist 中一样。

下面是代码

@override
Future<List<String>> getImageDownloadUrl(
    String id, List<Asset> imagePath) async 

  // Variable to hold the list of urls. 
  // Also I think you need only one String not List.
  List<String> list = List<String>();

  for (Asset asset in imagePath)  

    ByteData byteData = await asset.requestOriginal();
    List<int> imageData = byteData.buffer.asUint8List();

    var dateTime = new DateTime.now();
    final StorageReference firebaseStorageRef = FirebaseStorage.instance
        .ref()
        .child('images/' + id + '/' + dateTime.toString() + ' .jpg');

    // Using await to hold the value that result.
    var uploadTask = await firebaseStorageRef.putData(imageData).onComplete;
    String url = await uploadTask.ref.getDownloadURL();

    // Add the url to list
    list.add(url);
  

  return list;

【讨论】:

以上是关于Future dart/flutter 中的返回值的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 Firebase 实时数据库(Dart/Flutter)中是不是存在值?

好或坏:在 Dart/Flutter 中声明主方法异步

Dart / Flutter:Isolate ***函数的异步行为

Dart/Flutter Firestore 查询文档以列出问题

如何使用dart / flutter在不同类上使用变量

[Dart] Flutter开发中的几个常用函数