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

Flutter GridView点击项跳转对应命名路由问题求助

问题:网格项点击跳转对应命名路由失败

需要实现网格布局的每个项点击后跳转到各自对应的命名路由(如aa、bb、cc),但当前所有项点击后都只会跳转到同一个aa路由,如何解决?


现有代码:

Items列表:

List Fin = [
["aa", "Resources/Images/test/aa.png"],
["bb", "Resources/Images/test/bb.png"],
["cc", "Resources/Images/test/cc.png"],];

GridView代码:

GridView.builder(
        physics: const ScrollPhysics(),
        shrinkWrap: true,
        itemCount: Fin.length,
        gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
            crossAxisCount: 2, crossAxisSpacing: 10, mainAxisSpacing: 10),
        itemBuilder: (context, index) {
          return Test(
            title: Fin[index][0],
            icon: Fin[index][1],
          );
        },
      ),

Test类代码:

return InkWell(
  onTap: () {
    Navigator.pushNamed(context, Routes.aa);
  },
  child: Container(
    decoration: BoxDecoration(
      color: Colors.green,
      borderRadius: BorderRadius.circular(20),
    ),
  ),
);

解决方案:

核心思路是把每个网格项对应的路由名称传递给Test组件,让组件根据传入的路由名执行跳转,而非写死固定路由。

  1. 修改Test类,新增路由名称参数
    给Test类添加routeName参数,在onTap回调中使用该参数完成跳转:
class Test extends StatelessWidget {
  final String title;
  final String icon;
  final String routeName;

  const Test({
    super.key,
    required this.title,
    required this.icon,
    required this.routeName,
  });

  @override
  Widget build(BuildContext context) {
    return InkWell(
      onTap: () {
        Navigator.pushNamed(context, routeName);
      },
      child: Container(
        decoration: BoxDecoration(
          color: Colors.green,
          borderRadius: BorderRadius.circular(20),
        ),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Image.asset(icon),
            Text(title),
          ],
        ),
      ),
    );
  }
}
  1. 在GridView中传递对应路由名
    在itemBuilder中,根据当前项的标识匹配对应的路由路径,传递给Test组件:
GridView.builder(
        physics: const ScrollPhysics(),
        shrinkWrap: true,
        itemCount: Fin.length,
        gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
            crossAxisCount: 2, crossAxisSpacing: 10, mainAxisSpacing: 10),
        itemBuilder: (context, index) {
          String routePath;
          switch(Fin[index][0]){
            case 'aa':
              routePath = Routes.aa;
              break;
            case 'bb':
              routePath = Routes.bb;
              break;
            case 'cc':
              routePath = Routes.cc;
              break;
            default:
              routePath = '/'; // 默认路由
          }
          return Test(
            title: Fin[index][0],
            icon: Fin[index][1],
            routeName: routePath,
          );
        },
      ),
  1. 确保Routes类与路由注册正确
    确认Routes类已声明对应路由,并在MaterialApp中完成注册:
// Routes类定义
class Routes {
  static const String aa = '/aa';
  static const String bb = '/bb';
  static const String cc = '/cc';
}

// MaterialApp路由注册
MaterialApp(
  initialRoute: '/',
  routes: {
    Routes.aa: (context) => const AAScreen(),
    Routes.bb: (context) => const BBScreen(),
    Routes.cc: (context) => const CCScreen(),
  },
);

完成以上修改后,每个网格项点击时会跳转到各自对应的命名路由。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 05:07:31