Dart 返回 Future.value 始终为 null

李普伯特

我正在尝试从 Firebase 存储文件构建 URL,但Future<String>构建的 URL似乎总是返回null. 这是Future我打电话给:

Future<String> getUrlFromStorageRefFromDocumentRef(
      DocumentReference docRef) async {
    try {
      docRef.get().then((DocumentSnapshot documentSnapshot) {
        if (documentSnapshot.exists) {
          String filename = documentSnapshot.get('file');
          firebase_storage.Reference ref = firebase_storage
              .FirebaseStorage.instance
              .ref()
              .child('/flamelink/media/$filename');
          if (ref == null) {
            return Future.error("Storage Reference is null");
          } else {
            print(ref.fullPath);
            return Future.value(
                'https://storage.googleapis.com/xxxxxxxxx.appspot.com/${ref.fullPath}');
          }
        } else {
          return Future.error('No Snapshot for DocumentReference ${docRef.id}');
        }
      });
    } catch (e) {
      print(e);
      return Future.error('No DocumentReference for ID ${docRef.id}');
    }
  }

有问题的行是:

return Future.value(
                'https://storage.googleapis.com/xxxxxxxxx.appspot.com/${ref.fullPath}');

值得注意的是,String是从Firebase Storage路径生成的,一切看起来都很完美,直到返回值。

它应该将String值返回给我的调用代码,目前看起来像这样:

DocButtonCallback docCallback = () async {
      bool isKidsDoc = item.screenId == StringsManager.instance.screenIdKids;
      try {
        // first we need to get the URL for the document ...
        var url = await AssetManager.instance
            .getUrlFromStorageRefFromDocumentRef(isKidsDoc
                ? feature.relatedDocumentKidsRef
                : feature.relatedDocumentRef);

        String urlString = url.toString();

        canLaunch(urlString).then((value) {
          launch(urlString);
        }).catchError((error) {
          // TODO: open alert to tell user
        });
      } catch (error) {
        print(error);
      }
    };

我尝试了许多不同的方法来获得它,String包括:

DocButtonCallback docCallback = () async {
      bool isKidsDoc = item.screenId == StringsManager.instance.screenIdKids;
      await AssetManager.instance
          .getUrlFromStorageRefFromDocumentRef(isKidsDoc
              ? feature.relatedDocumentKidsRef
              : feature.relatedDocumentRef)
          .then((urlString) {
        canLaunch(urlString).then((value) {
          launch(urlString);
        }).catchError((error) {
          // TODO: open alert to tell user
        });
      }).catchError((error) {
        // TODO: open alert to tell user
      });
    };

出于某种原因,Future总是返回null我在这里做错了什么?

库内克斯

您正在返回回调中Futurethen(),它本质上是从回调本身而不是从您的getUrlFromStorageRefFromDocumentRef()函数返回此值在那里您只需要在此之前添加一个 return 语句:

当前的:

docRef.get().then((DocumentSnapshot documentSnapshot) {
  if (documentSnapshot.exists) {
    ...

后:

/// Adding the return statement here to return the actual value
/// returned internally by the then callback
return docRef.get().then((DocumentSnapshot documentSnapshot) {
  if (documentSnapshot.exists) {
    ...

如果您将鼠标悬停在then()回调上,您的 IDE 应该向您显示此回调将返回Future<T>(或任何通用类型占位符),为了使其可用,还需要返回该回调

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章