Flutter应用图片在模拟器正常加载,打包APK后手机显示灰块问题
问题排查及解决方案
1. 检查Android网络权限配置
debug模式下Android默认自带网络权限,release包需要手动声明权限,在android/app/src/main/AndroidManifest.xml的<manifest>根标签下添加如下配置:
<uses-permission android:name="android.permission.INTERNET" />
2. 处理HTTP明文流量限制
如果你的图片链接是HTTP协议(非HTTPS),Android 9(API level 28)及以上系统默认禁止明文流量,会导致HTTP资源加载失败,两种解决方案:
- 优先将图片链接升级为HTTPS协议
- 如需保留HTTP访问,在
AndroidManifest.xml的<application>标签中添加属性:
android:usesCleartextTraffic="true"
3. 补充错误捕获逻辑定位具体问题
现有代码缺少错误回调,无法确认加载失败的具体原因,建议给CachedNetworkImage补充errorWidget参数,打印错误信息方便排查:
CachedNetworkImage( imageUrl: url, fit: BoxFit.cover, placeholder: (_, __) => const Center(child: CupertinoActivityIndicator(radius: 15)), // 新增错误回调逻辑 errorWidget: (context, url, error) { print("图片加载失败:$error"); return const Center(child: Icon(Icons.error, color: Colors.red)); }, )
4. 修复布局冗余问题
Expanded组件仅可在Row/Column/Flex类型的父组件中使用,你当前的父组件是已经指定了宽高的Container,嵌套Expanded属于无效用法,还可能导致布局约束异常,建议直接移除Expanded包裹:
@override Widget build(BuildContext context) { return Container( width: MediaQuery.of(context).size.width, height: MediaQuery.of(context).size.height, child: CachedNetworkImage( // 其余原有参数保持不变 ), ); }
5. 检查release混淆配置
如果你的项目开启了release混淆压缩,确保在android/app/proguard-rules.pro中添加了相关保留规则,避免底层依赖库被混淆删除:
-keep class com.caverock.androidsvg.** { *; } -keep class com.bumptech.glide.** { *; }
内容的提问来源于stack exchange,提问作者Giovanny
相关产品推荐
相关产品推荐

