Firebase Storage中的Image.network()在Chrome中工作,在Android中失败

h4cxqtbf  于 2023-11-21  发布在  .NET
关注(0)|答案(1)|浏览(121)

我正在从Firebase Storage中的URL加载NetworkImage。从vscode运行相同的代码而不接触它...
设备:Chrome ->它工作完全正常
设备:Android模拟器->它失败与下面的错误
设备:Android物理手机->它失败与下面的错误
但奇怪的是,当我运行调试会话中保留在Android设备上的应用程序时,它完全正常工作。这部分让我特别困惑。不知何故,调试器影响了它?
有没有人遇到过类似的问题和/或有关于什么调试路径可能更有成效的建议?
示例代码:

class RepImage extends StatelessWidget {
  const RepImage({super.key, required this.repId});
  final String repId;

  @override
  Widget build(BuildContext context) {
    return FutureBuilder<String>(
      future: repImageUrl(repId),
      builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
        Widget widget;
        if (!snapshot.hasData) {
          widget = const Icon(Icons.person, size: 60);
        } else if (snapshot.hasError) {
          widget = const Icon(Icons.error);
        } else {
          widget = Image.network(snapshot.data!);
        }

        return Center(
          child: ClipRRect(
            borderRadius: BorderRadius.circular(10.0),
            child: widget,
          ),
        );
      },
    );
  }
}

Future<String> repImageUrl(repId) async {
  String path = '/images/rep';
  String filename = '${repId}_120px.png';
  Reference ref = storageRef(path, filename);

  return storageUrl(ref);
}

Future<String> storageUrl(Reference ref) async {
  var url = await ref.getDownloadURL();
  return url;
}

Reference storageRef(path, filename) {
  Reference ref = FirebaseStorage.instance.ref().child(path).child(filename);
  return ref;
}

字符串
错误代码:

E/StorageException(29922): StorageException has occurred.
E/StorageException(29922): Object does not exist at location.
E/StorageException(29922):  Code: -13010 HttpResult: 404
E/StorageException(29922): {  "error": {    "code": 404,    "message": "Not Found."  }}
E/StorageException(29922): java.io.IOException: {  "error": {    "code": 404,    "message": "Not Found."  }}
E/StorageException(29922):  at com.google.firebase.storage.network.NetworkRequest.parseResponse(NetworkRequest.java:445)
E/StorageException(29922):  at com.google.firebase.storage.network.NetworkRequest.parseErrorResponse(NetworkRequest.java:462)
E/StorageException(29922):  at com.google.firebase.storage.network.NetworkRequest.processResponseStream(NetworkRequest.java:453)
E/StorageException(29922):  at com.google.firebase.storage.network.NetworkRequest.performRequest(NetworkRequest.java:272)
E/StorageException(29922):  at com.google.firebase.storage.network.NetworkRequest.performRequest(NetworkRequest.java:289)

rdlzhqv9

rdlzhqv91#

我算是弄明白了,这很令人讨厌,但事实证明,在其他平台上运行的代码在Android上运行完全不同。我在getDownloadURL()之后对数据和错误进行的检查在Web上很好,但在Android上,底层lib抛出错误,而不是将它们打包到返回的对象中。
我突然想到,它在我的物理设备上运行应用程序时工作的原因是因为它会忽略那些抛出的错误并尝试继续。
为了让它在调试中也能工作,我在调用getDownloadURL()时捕获了抛出的错误,如下所示。

Future<String?> storageUrl(Reference ref) async {
  String? url;
  try {
    url = await ref.getDownloadURL();
  } catch (error) {
    print("----- caught error from getDownloadURL: $error");
    url = null;
  }

  return url;
}

字符串
令我非常失望的是,在请求下载URL之前,没有一种方法可以检查引用(即ref.exists)的有效性。

相关问题