Flutter 命名路由与传参
路由配置
router/router.dart
import 'package:flutter/material.dart';
import '../pages/home.dart';
import '../pages/search.dart';
import '../pages/category.dart';
class MyRouter {
// 路由列表
final Map<String, Widget Function(BuildContext)> _routes = {
'/': (context) => const Home(),
'/search': (context, {arguments}) => Search(search: arguments), //传参路由
'/category': (context) => const Category(),
};
// 默认路由
String initialRoute = '/';
final BuildContext context;
MyRouter(this.context, [this.initialRoute = '/']);
// 命名路由传参设置
Route<dynamic>? onGenerateRoute(RouteSettings settings) {
final String? name = settings.name;
final Function? pageContentBuilder = _routes[name];
if (pageContentBuilder != null) {
if (settings.arguments != null) {
final Route route = MaterialPageRoute(
builder: (context) =>
pageContentBuilder(context, arguments: settings.arguments));
return route;
} else {
final Route route = MaterialPageRoute(
builder: (context) => pageContentBuilder(context));
return route;
}
}
return null;
}
}
引入路由配置
main.dart
import 'package:flutter/material.dart';
import './router/router.dart';
void main() {
runApp(const App());
}
class App extends StatelessWidget {
const App({super.key});
@override
Widget build(BuildContext context) {
final route = MyRouter(context);
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
useMaterial3: true,
primaryColor: Colors.blue,
),
initialRoute: route.initialRoute,
// 渲染路由
onGenerateRoute: route.onGenerateRoute,
);
}
}
路由跳转
pages/home.dart
import 'package:flutter/material.dart';
class Home extends StatelessWidget {
const Home({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Home'),
),
body: Column(
children: [
const Text('首页'),
ElevatedButton(
onPressed: () {
// 命名路由传参
Navigator.pushNamed(context, '/search', arguments: 'search');
},
child: const Text('搜索'),
),
ElevatedButton(
onPressed: () {
Navigator.pushNamed(context, '/category');
},
child: const Text('分类'),
),
],
),
);
}
}
页面接收路由参数
pages/search.dart
import 'package:flutter/material.dart';
class Search extends StatelessWidget {
final String search; // 传入的参数,参数名与router.dart中对应的配置保持一致
const Search({super.key, required this.search});
@override
Widget build(BuildContext context) {
// print(arguments);
return Scaffold(
appBar: AppBar(
title: const Text('Search'),
),
body: Column(
children: [
Text(search),
],
),
);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效