Flutter安卓端NetworkImage网络图片真机无法加载模拟器正常
问题现象
- 开发场景:安卓平台Flutter食谱搜索应用,当前接入Edamam API,暂未对接Firebase,用户头像使用占位图片
- 异常表现:应用在安卓模拟器运行时可正常加载网络图片,安装到实体安卓手机后所有网络图片均无法加载
- 现有图片加载实现代码:
image: DecorationImage( image: NetworkImage(query["hits"][index]["recipe"]["image"]), )
问题产生原因
该问题是模拟器和真机的安卓系统规则差异导致,核心诱因有两个:
- 网络权限校验规则差异:部分安卓模拟器默认放宽了应用权限校验,即使应用没有主动声明互联网访问权限,也允许发起网络请求;但真机系统会严格执行权限校验,未声明对应权限的应用会被直接禁止访问网络。
- 明文流量拦截规则差异:安卓9(API级别28)及以上版本默认开启明文流量拦截,禁止应用发起未加密的HTTP请求。Edamam API返回的部分图片链接为HTTP协议,若真机系统版本高于等于安卓9,就会直接拦截这类图片请求;如果模拟器运行的是低于API28的安卓版本,或是默认关闭了明文流量拦截,就不会触发该问题。
解决方法
按照以下步骤逐一配置即可修复:
添加互联网访问权限
打开项目路径下的android/app/src/main/AndroidManifest.xml文件,在根节点<manifest>标签内部、<application>标签之前,添加网络权限声明:<uses-permission android:name="android.permission.INTERNET" />配置允许明文流量访问
还是在上述AndroidManifest.xml文件中,找到<application>标签,新增android:usesCleartextTraffic="true"属性,放开HTTP请求限制,示例配置如下:<application android:label="你的应用名称" android:name="${applicationName}" android:icon="@mipmap/ic_launcher" android:usesCleartextTraffic="true"> <!-- 其余原有配置保持不变即可 --> </application>生效配置
注意:清单文件的改动无法通过热重载/热更新生效,需要先卸载真机上已经安装的旧版应用,再重新执行编译安装操作,新的配置才会生效。
可选体验优化
可以替换原生NetworkImage为支持错误兜底、缓存能力的图片加载组件,配置加载中占位、加载失败占位图,避免网络波动、链接失效时出现页面空白或组件报错。
内容的提问来源于stack exchange,提问作者Zaid Ahmed Soomro
相关产品推荐
相关产品推荐

