You need to enable JavaScript to run this app. 如何为Flutter的ListView.builder子项添加点击跳转功能
优惠活动
大模型
产品
解决方案
定价
更多

如何为Flutter的ListView.builder子项添加点击跳转功能

实现方案

你只需要给ListView.builder返回的子项容器外层包裹可点击组件即可,优先推荐用带点击反馈效果的InkWell组件,示例修改逻辑如下:

  1. 在itemBuilder返回的根Container外层嵌套InkWell组件
  2. 在InkWell的onTap回调中编写路由跳转逻辑,根据你子项的属性判断跳转standard还是vip页面
  3. 为了适配你原有子项的圆角样式,给InkWell设置和子项一致的圆角,保证点击水波纹效果正常

修改后核心代码示例

Widget build(BuildContext context) {
    return Container(
      height: 350,
      child: ListView.builder(
        scrollDirection: Axis.horizontal,
        padding: EdgeInsets.only(left: 16, right: 6),
        itemCount: ultraComputers().length,
        itemBuilder: (context, index) {
          // 拿到当前索引对应的子项数据
          final computerItem = ultraComputers()[index];
          return InkWell(
            // 配置和子项一致的圆角,保证水波纹效果适配
            borderRadius: BorderRadius.circular(20),
            onTap: () {
              // 根据子项属性判断跳转的路由,这里假设你子项有type字段区分standard/vip
              // 如果是按索引区分也可以自行修改判断条件
              String targetRoute;
              if(computerItem.type == 'standard'){
                targetRoute = '/standard'; // 替换为你在main.dart中注册的standard页面对应路由名
              }else if(computerItem.type == 'vip'){
                targetRoute = '/vip'; // 替换为你在main.dart中注册的vip页面对应路由名
              }else{
                // 可自定义其他场景的跳转逻辑
                return;
              }
              // 执行路由跳转
              Navigator.pushNamed(context, targetRoute);
            },
            child: Container(
              margin: EdgeInsets.only(right: 15),
              width: 350,
              decoration: BoxDecoration(
                borderRadius: BorderRadius.circular(20),
                image: DecorationImage(
                  image: AssetImage(computerItem.image),
                ),
              ),
              child: Stack(
                children: [
                  Positioned(
                    top: 300,
                    left: 16,
                    child: Text(
                      computerItem.description,
                      style: GoogleFonts.jura(
                        textStyle: TextStyle(
                            color: Colors.white,
                            fontWeight: FontWeight.bold,
                            fontSize: 40),
                      ),
                    ),
                  ),
                  Positioned(
                    top: 15,
                    left: 20,
                    child: Text(
                      computerItem.city,
                      style: GoogleFonts.jura(
                        textStyle: TextStyle(
                            color: Colors.white,
                            fontWeight: FontWeight.bold,
                            fontSize: 25),
                      ),
                    ),
                  ),
                  // 你原有代码剩下的其他子组件部分
                ],
              ),
            ),
          );
        },
      ),
    );
}

注意事项

  • 如果你不需要点击水波纹效果,可以把InkWell替换为GestureDetector,不需要配置borderRadius属性
  • 代码中判断跳转路由的逻辑可以根据你的实际业务调整,比如按索引判断、按description/city字段判断都可以
  • 路由名需要和你在main.dart的MaterialApp的routes中注册的名称完全一致

内容的提问来源于stack exchange,提问作者Чак Джонс

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 10:51:03