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

Flutter中GridView Builder构建APK后显示异常求助

Flutter构建APK后GridView显示异常修复方案

问题说明

未构建APK时GridView显示正常,构建正式APK后出现显示异常,以下是相关代码,需修复该问题使APK构建后的GridView显示恢复正常。

原代码

body: SafeArea(
  child: Padding(
    padding: const EdgeInsets.symmetric(horizontal: 15),
    child: Column(
      crossAxisAlignment: CrossAxisAlignment.center,
      children: [
        Text('Select Your City'),
        Expanded(child: GridView.builder(
          shrinkWrap: true,
          physics: NeverScrollableScrollPhysics(),
          padding: const EdgeInsets.symmetric(horizontal: 20),
          itemCount: serviceDataList.length,
          itemBuilder: (ctx, i) {
            return GestureDetector(
              onTap: () {
                setState(() async {
                  if(isRedundentClick(DateTime.now())){
                    Fluttertoast.showToast(
                      msg: "hold on, processing",
                      toastLength: Toast.LENGTH_SHORT,
                      timeInSecForIosWeb: 1,
                      backgroundColor: Colors.red,
                      textColor: Colors.white,
                      fontSize: 16.0,
                    );
                    return;
                  }else{
                    SharedPreferences prefs = await SharedPreferences.getInstance();
                    prefs.setString('City_Id', serviceDataList[i]['city_id']);
                    prefs.setString('City_Name', serviceDataList[i]['city_name']);
                    prefs.setString('City_Lat', serviceDataList[i]['city_lat']);
                    prefs.setString('City_Long', serviceDataList[i]['city_long']);
                    print(serviceDataList[i]['city_id']);
                    print(serviceDataList[i]['city_name']);
                    int? rowsEffected2 = await dbHelper?.deletecart();
                    print(rowsEffected2);
                    Navigator.push(context, MaterialPageRoute(builder:(context)=>Navigation()));
                  }
                });
              },
              child: Card(
                  elevation: 4,
                  color: Colors.white,
                  child: Column(
                    children: [
                      Container(
                        height: 210,
                        decoration: BoxDecoration(
                            borderRadius: BorderRadius.circular(20)),
                        margin: EdgeInsets.all(5),
                        padding: EdgeInsets.all(5),
                        child: Stack(
                          children: [
                            Column(
                              mainAxisAlignment: MainAxisAlignment.center,
                              crossAxisAlignment: CrossAxisAlignment.center,
                              children: [
                                ConstrainedBox(
                                  constraints: new BoxConstraints(
                                    maxHeight: 200.0,
                                  ),
                                  child: Expanded(
                                    child: Image.network(
                                      serviceDataList[i]['city_img'] ?? '',
                                      fit: BoxFit.fill,
                                    ),
                                  ),
                                ),
                              ],
                            ),
                          ],
                        ),
                      ),
                      SizedBox(
                        height: 35,
                        child: Container(
                          color: Colors.grey.shade300,
                          child: Center(
                            child: Text(
                              serviceDataList[i]['city_name'],
                              style: TextStyle(
                                fontSize: 18,
                                fontWeight: FontWeight.bold,
                              ),
                            ),
                          ),
                        ),
                      ),
                    ],
                  )
              ),
            );
          },
          gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
            crossAxisCount: 2,
            childAspectRatio: 1.0,
            crossAxisSpacing: 5,
            mainAxisSpacing: 5,
            mainAxisExtent: 264,
          ),
        ),)
      ]
    )
  )
)

修复方案

1. 移除冲突的布局属性

GridView已被Expanded包裹,无需设置shrinkWrap: true,该属性在release模式下会导致布局计算异常。同时NeverScrollableScrollPhysics与Expanded组合可能引发滚动冲突,建议调整:

Expanded(child: GridView.builder(
  // 移除shrinkWrap: true
  physics: AlwaysScrollableScrollPhysics(), // 根据需求保留或调整
  padding: const EdgeInsets.symmetric(horizontal: 20),
  itemCount: serviceDataList.length,
  // 其余代码不变
))

2. 优化图片加载逻辑

release模式下网络图片易出现加载失败或布局异常,添加错误占位图与加载状态,并确保图片URL可访问:

Image.network(
  serviceDataList[i]['city_img'] ?? '',
  fit: BoxFit.fill,
  height: double.infinity,
  width: double.infinity,
  errorBuilder: (context, error, stackTrace) {
    return Icon(Icons.broken_image, size: 100, color: Colors.grey);
  },
  loadingBuilder: (context, child, loadingProgress) {
    if (loadingProgress == null) return child;
    return Center(child: CircularProgressIndicator());
  },
)

3. 简化冗余布局结构

原布局中Stack与多层Column嵌套无意义,且ConstrainedBox配合Expanded在固定高度容器内易导致计算错误,简化图片容器:

Container(
  height: 210,
  decoration: BoxDecoration(
      borderRadius: BorderRadius.circular(20)),
  margin: EdgeInsets.all(5),
  padding: EdgeInsets.all(5),
  child: ClipRRect(
    borderRadius: BorderRadius.circular(20),
    child: Image.network(
      serviceDataList[i]['city_img'] ?? '',
      fit: BoxFit.fill,
      height: double.infinity,
      width: double.infinity,
    ),
  ),
)

4. 检查编译配置与权限

  • 确保android/app/src/main/AndroidManifest.xml添加网络权限:
    <uses-permission android:name="android.permission.INTERNET" />
    
  • 检查pubspec.yaml中未禁用图片缓存相关配置,确保release模式下资源加载正常。

内容的提问来源于stack exchange,提问作者Red Player Gaming

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 23:05:20