You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase Storage的Image.network()在Chrome正常,Android端异常

Firebase Storage图片加载调试前后行为不一致问题

同一代码加载Firebase Storage的NetworkImage,不同环境表现有差异:

  • Chrome浏览器:完全正常
  • Android模拟器:出现404错误
  • Android真机:出现404错误

奇怪的是,调试会话结束后留在Android设备上的App却能正常运行,怀疑调试器影响了运行逻辑,求类似问题经验或有效排查方向。

示例代码

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)

排查方向建议

  1. 调试模式网络与缓存差异
    调试模式下Flutter默认禁用图片缓存,且可能开启额外的网络校验逻辑。可以尝试在调试时手动启用缓存,或者检查是否开启了抓包代理(如Charles)导致请求路由异常。另外,调试模式的网络超时设置可能更严格,可尝试调整Firebase Storage的请求超时参数。

  2. 身份验证与权限差异
    调试版和正式版的google-services.json可能不同,导致Firebase身份验证状态有差异。检查调试时用户是否已正确登录,以及Firebase Storage的安全规则是否允许调试环境下的访问。同时,确认调试时的App签名是否符合Storage权限要求。

  3. FutureBuilder重复请求问题
    当前代码在build方法中直接创建repImageUrl(repId) Future,调试模式下Widget重建频繁(如热重载、调试工具触发),会导致重复发起请求,可能触发Firebase的临时限流或访问异常。建议将Future的创建移至initState(改为StatefulWidget),或使用memoized缓存Future避免重复调用。

  4. 调试器性能干扰
    调试模式下CPU、内存占用较高,可能导致Firebase SDK初始化延迟或网络请求超时。查看调试时的Firebase初始化日志,确认SDK是否完全初始化;也可以尝试在调试时关闭部分调试工具(如性能监控),看是否能缓解问题。

  5. 路径一致性验证
    打印调试时实际请求的Storage路径,与Firebase控制台中的文件路径逐字符对比,确认大小写、拼写完全一致(部分环境对路径大小写敏感)。

内容的提问来源于stack exchange,提问作者cmjordan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 06:35:35