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

问题描述 投票:0回答:1

我正在从 Firebase 存储中的 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)
flutter firebase image firebase-storage
1个回答
0
投票

我有点明白了,这非常令人讨厌,但事实证明,在其他平台上运行的代码在 Android 上运行完全不同。我在

getDownloadURL()
之后对数据和错误所做的检查在 Web 上很棒,但在 Android 上,底层库会抛出错误,而不是将它们打包到返回的对象中。

我发现它在我的物理设备上运行应用程序时起作用的原因是因为它会忽略那些抛出的错误并尝试继续。

为了让它在调试中也能工作,我在调用

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
)的有效性。

© www.soinside.com 2019 - 2024. All rights reserved.