【问题标题】:Return value in Future dart/flutterFuture 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 是为你编码的,并告诉我它是否有效或发生了什么?

标签: firebase firebase-realtime-database flutter dart firebase-storage


【解决方案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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    相关资源
    最近更新 更多