Firebase Storage的Image.network()在Chrome正常,Android端异常
同一代码加载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)
排查方向建议
调试模式网络与缓存差异
调试模式下Flutter默认禁用图片缓存,且可能开启额外的网络校验逻辑。可以尝试在调试时手动启用缓存,或者检查是否开启了抓包代理(如Charles)导致请求路由异常。另外,调试模式的网络超时设置可能更严格,可尝试调整Firebase Storage的请求超时参数。身份验证与权限差异
调试版和正式版的google-services.json可能不同,导致Firebase身份验证状态有差异。检查调试时用户是否已正确登录,以及Firebase Storage的安全规则是否允许调试环境下的访问。同时,确认调试时的App签名是否符合Storage权限要求。FutureBuilder重复请求问题
当前代码在build方法中直接创建repImageUrl(repId)Future,调试模式下Widget重建频繁(如热重载、调试工具触发),会导致重复发起请求,可能触发Firebase的临时限流或访问异常。建议将Future的创建移至initState(改为StatefulWidget),或使用memoized缓存Future避免重复调用。调试器性能干扰
调试模式下CPU、内存占用较高,可能导致Firebase SDK初始化延迟或网络请求超时。查看调试时的Firebase初始化日志,确认SDK是否完全初始化;也可以尝试在调试时关闭部分调试工具(如性能监控),看是否能缓解问题。路径一致性验证
打印调试时实际请求的Storage路径,与Firebase控制台中的文件路径逐字符对比,确认大小写、拼写完全一致(部分环境对路径大小写敏感)。
内容的提问来源于stack exchange,提问作者cmjordan

