Flutter点击Continue按钮无法跳转Login页面问题求助
错误根源
出现Navigator.onGenerateRoute was null, but the route named "/login" was referenced错误,是因为你的MaterialApp未正确配置命名路由的处理逻辑,导致Navigator.pushNamed找不到对应路由。
正确配置步骤
1. 统一管理路由映射(Routes.dart)
用常量定义路由名称,避免拼写错误:
import 'package:flutter/material.dart'; import 'path/to/your/login_page.dart'; // 替换为你的登录页实际路径 class Routes { static const String login = "/login"; static Route<dynamic> generateRoute(RouteSettings settings) { switch (settings.name) { case login: return MaterialPageRoute(builder: (_) => const LoginPage()); // 可添加其他路由映射 default: // 处理未定义路由 return MaterialPageRoute( builder: (_) => Scaffold( body: Center(child: Text("未找到路由: ${settings.name}")), ), ); } } }
2. 配置MaterialApp(main.dart)
必须给MaterialApp设置onGenerateRoute或routes属性,二选一即可:
import 'package:flutter/material.dart'; import 'Routes.dart'; import 'path/to/your/body_page.dart'; void main() => runApp(const MyApp()); class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( title: 'App Title', initialRoute: '/', home: const BodyPage(), // 方式一:使用自定义路由生成器 onGenerateRoute: Routes.generateRoute, // 方式二:直接用routes映射(适合简单场景) // routes: { // Routes.login: (context) => const LoginPage(), // }, ); } }
3. 正确调用pushNamed(Body.dart)
按钮点击事件中使用与路由表一致的名称,推荐用常量:
import 'package:flutter/material.dart'; import 'Routes.dart'; class BodyPage extends StatelessWidget { const BodyPage({super.key}); @override Widget build(BuildContext context) { return Scaffold( body: Center( child: ElevatedButton( onPressed: () { // 两种写法都可行,推荐用常量避免拼写错误 Navigator.pushNamed(context, Routes.login); // Navigator.pushNamed(context, "/login"); }, child: const Text("Continue"), ), ), ); } }
关键注意点
- 路由名称大小写敏感,必须完全匹配
- 不要同时用
routes和onGenerateRoute处理同一个路由(优先级:onGenerateRoute>routes) - 确保登录页文件已正确导入,无路径错误
内容的提问来源于stack exchange,提问作者Jayaditya Mishra
相关产品推荐
相关产品推荐

