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

自定义分类卡片列表滚动时出现异常视觉效果的问题求助

自定义分类卡片列表滚动时出现异常视觉效果的问题求助

大家好,我最近在开发一个分类卡片列表功能,为了实现自定义图片显示和圆角边框效果,没有使用Flutter自带的Card组件,而是选择用Container搭建基础布局,配合Ink和InkWell实现点击水波纹效果。

但现在遇到了一个奇怪的视觉问题:列表滚动时,卡片组件像是被拆分开来一样出现异常的视觉分解,尤其是从分类详情页返回主列表页的时候,这个问题在真机的release构建版本中表现得特别明显。

我的实现代码如下:

1. 分类页面主组件

class CategoriesScreen extends ConsumerWidget {
  const CategoriesScreen({super.key});

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final categoriesNavigationKey = ref.read(categoriesNavigationKeyProvider);
    return PopScope(
      canPop: false,
      onPopInvokedWithResult: (route, result) => categoriesNavigationKey.currentState!.maybePop(),
      child: Navigator(
        key: categoriesNavigationKey,
        initialRoute: '/',
        onGenerateRoute: (settings) {
          if (settings.name != null) {
            final String routeName = settings.name!;
            if (routeName == '/categoryDetails') {
              return CupertinoPageRoute<void>(
                settings: settings,
                builder: (context) => CategoryDetailsScreen(
                  category: Category.fromJson(
                    settings.arguments as Map<String, dynamic>,
                  ),
                ),
              );
            }
          }
          return CupertinoPageRoute<void>(
            settings: settings,
            builder: (context) => const _CategoriesList(),
          );
        },
      ),
    );
  }
}

2. 分类列表组件

class _CategoriesList extends ConsumerWidget {
  const _CategoriesList();

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final textTheme = Theme.of(context).textTheme;
    final categoriesScreenController = ref.watch(categoriesControllerProvider);
    return categoriesScreenController.maybeWhen(
      orElse: () {
        return Center(child: CircularProgressIndicator());
      },
      data: (categories) {
        return Scrollbar(
          child: SingleChildScrollView(
            child: Padding(
              padding: const EdgeInsets.all(24.0),
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                spacing: 16,
                children: [
                  Text("Toutes nos catégories", style: textTheme.titleLarge),
                  for (final category in categories) CategoryItem(category: category),
                ],
              ),
            ),
          ),
        );
      },
    );
  }
}

3. 分类卡片组件

class CategoryItem extends ConsumerWidget {
  final Category category;
  final BorderRadius _borderRadius = const BorderRadius.all(
    Radius.circular(16),
  );

  const CategoryItem({super.key, required this.category});

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    return Ink(
      decoration: BoxDecoration(
        borderRadius: _borderRadius,
        color: Theme.of(context).colorScheme.surface,
        boxShadow: kElevationToShadow[3],
      ),
      child: InkWell(
        onTap: () => ref
            .read(categoriesNavigationKeyProvider)
            .currentState
            ?.pushNamed('/categoryDetails', arguments: category.toJson()),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Container(
              clipBehavior: Clip.antiAlias,
              width: double.infinity,
              decoration: BoxDecoration(borderRadius: _borderRadius),
              child: Image.memory(
                category.image,
                fit: BoxFit.cover,
                height: 200,
              ),
            ),
            Padding(
              padding: const EdgeInsets.all(22),
              child: Text(
                category.name,
                style: Theme.of(
                  context,
                ).textTheme.titleMedium?.copyWith(fontWeight: FontWeight.bold),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

问题现象

在真机的release版本中,列表滚动(尤其是从详情页返回主列表路由时),卡片的视觉效果会出现分解,明明是一个完整的组件,却看起来像是被拆成了几个部分。

想请教各位,我是不是在代码实现中遗漏了什么关键配置?还是这属于Flutter引擎或框架层面的问题?

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 11:23:06