Android模拟器使用Firebase Storage模拟器出现Connection Refused错误如何解决
问题诱因
- 核心诱因是Firebase Storage模拟器的
getDownloadURL()方法默认返回的URL主机名固定为localhost,安卓模拟器中的localhost指向模拟器自身环回地址,而非运行模拟器的宿主机,因此无法正常访问宿主机上的Storage模拟器服务。你在本地浏览器可以正常访问,是因为浏览器运行在宿主机上,localhost对应宿主机本身。 cached_network_image包会直接使用拿到的下载URL发起请求,不会自动识别安卓模拟器环境替换主机名,因此会直接请求错误的地址触发连接拒绝错误。- 其他可能的次要诱因:Storage模拟器启动时仅绑定了
127.0.0.1接口,没有允许外部设备访问;安卓模拟器网络配置异常无法访问宿主机。
解决方案
- 调整模拟器启动参数
启动Firebase Emulator Suite时添加--host 0.0.0.0参数,确保Storage模拟器监听所有网络接口,允许来自安卓模拟器等外部设备的访问:
firebase emulators:start --host 0.0.0.0
- 手动替换下载URL的主机名
在调用getDownloadURL()获取到地址后,判断当前为模拟器环境时,手动将URL中的localhost替换为适配当前平台的宿主机地址,示例代码如下:
Future<String> getAdjustedStorageUrl(Reference ref) async { String rawUrl = await ref.getDownloadURL(); if (USE_EMULATOR) { final localHost = Platform.isAndroid ? '10.0.2.2' : 'localhost'; rawUrl = rawUrl.replaceFirst('http://localhost', 'http://$localHost'); } return rawUrl; }
后续将调整后的URL传给cached_network_image即可正常加载。
3. 可选校验项
- 确认你使用的
firebase_storage依赖已升级到最新稳定版,排除旧版本SDK本身的模拟器适配bug。 - 确认安卓模拟器网络正常,可以尝试在模拟器内置浏览器中访问
http://10.0.2.2:9199验证是否能打开Storage模拟器的欢迎页面。
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

