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

Flutter SliverGrid滚动即将停止时卡顿问题求助

Flutter Android滚动即将停止时卡顿排查方案(多Sliver组件场景)

针对你的场景(主页使用多个SliverToBoxAdapter和SliverGrid,Android设备滚动即将停止时卡顿,Impeller开启后稍有改善),可以从以下几个方向排查优化:

1. 减少不必要的组件重建

  • 用Profile模式的Performance面板分析帧耗时,重点看滚动停止阶段是否有大量组件重建。多个SliverToBoxAdapter如果包裹的无状态组件没加const,会导致每次滚动都触发重建。
  • 给所有可复用的无状态组件添加const修饰,比如:
    const SliverToBoxAdapter(child: CategoryWidget())
    

2. 优化SliverGrid的item缓存

  • 给Grid的item组件混入AutomaticKeepAliveClientMixin,让可见的item保持状态,避免滚动回来时重新构建:
    class ProductCard extends StatefulWidget {
      // ...
    }
    
    class _ProductCardState extends State<ProductCard> with AutomaticKeepAliveClientMixin {
      @override
      bool get wantKeepAlive => true;
    
      @override
      Widget build(BuildContext context) {
        super.build(context); // 必须调用
        return // 你的卡片布局
      }
    }
    
  • 检查SliverGridDelegate的参数,确保crossAxisCount和childAspectRatio符合实际布局需求,避免不必要的布局计算。

3. 深度优化图片加载

  • 除了固定宽高,使用cacheWidth/cacheHeight让图片缓存适配显示尺寸,减少内存占用:
    Image.network(
      imageUrl,
      width: 100,
      height: 100,
      cacheWidth: 200, // 按2倍像素缓存,适配高清屏
      cacheHeight: 200,
    )
    
  • 考虑用图片缓存库统一管理图片缓存,避免重复请求和内存泄漏。

4. Android渲染层优化

  • 确认AndroidManifest.xml的<application>标签中已开启硬件加速:
    <application
      android:hardwareAccelerated="true"
      <!-- 其他配置 -->
    </application>
    
  • 去掉不必要的复杂绘制效果,比如多层嵌套的阴影、圆角。如果必须用,尽量用ClipRRect替代复杂的自定义Painter,减少绘制开销。

5. 排查内存波动

  • 用Profile模式的Memory面板监控滚动时的内存变化,如果内存突然暴涨后回落,可能是GC在滚动停止时触发导致卡顿。此时需要检查是否有未释放的资源(比如图片、控制器)。

内容的提问来源于stack exchange,提问作者Kanat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 09:30:07