不传递参数的命名路由:
import 'package:flutter/material.dart';// 创建页面import './tabs/tabs.dart';import './pages/home.dart';import './pages/search.dart';import './pages/detail.dart';import './pages/me.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: 'Retrieve Text Input',home: MyBottomNavigationBar(),// 定义路由routes: {'/home': (context) => HomePage(),'/search': (context) => SearchPage(),'/detail': (context) => DetailPage(),'/me': (context) => MePage(),},);}}// 例子: home.dart 页面import 'package:flutter/material.dart';class HomePage extends StatefulWidget {@override_HomePageState createState() => _HomePageState();}class _HomePageState extends State<HomePage> {@overrideWidget build(BuildContext context) {return Center(child: ElevatedButton(child: Text('跳转到详情页面'),onPressed: () {// 由于我们在全局定义了路由, 所以这里可以直接使用, 而不需要想普通路由那样,引入需要跳转的页面Navigator.pushNamed(context, '/detail');},),);}}
传递参数的命名路由:
import 'package:flutter/material.dart';import './tabs/tabs.dart';import './pages/home.dart';import './pages/search.dart';import './pages/detail.dart';import './pages/me.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {final Map routes = {'/home': (context) => HomePage(),'/search': (context) => SearchPage(),'/detail': (context, { arguments }) => DetailPage(arguments: arguments),'/me': (context, { arguments }) => MePage(arguments: arguments),};@overrideWidget build(BuildContext context) {return MaterialApp(title: 'Retrieve Text Input',home: MyBottomNavigationBar(),// 固定写法, 可以在任意的命名路由中传递参数onGenerateRoute: (RouteSettings settings) {// 获取路由名称final String name = settings.name;// 获取路由final Function pageContentBuilder = this.routes[name];if(pageContentBuilder != null) {// 判读是否有 参数 , 注意, 这个参数命名 arguments , 你可以另取名称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;}}},);}}// home.dart 传递参数import 'package:flutter/material.dart';class HomePage extends StatefulWidget {@override_HomePageState createState() => _HomePageState();}class _HomePageState extends State<HomePage> {@overrideWidget build(BuildContext context) {return Center(child: ElevatedButton(child: Text('跳转到详情页面'),onPressed: () {// 传递参数, 注意 因为你的参数命名为 arguments , 所以这里要统一,并携带你需要的参数Navigator.pushNamed(context, '/detail', arguments: { "id": 123 });},),);}}//detail.dart 接受参数import 'package:flutter/material.dart';class DetailPage extends StatelessWidget {// 构造函数内接受参数DetailPage({this.arguments});final arguments;@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('详情页面'),),body: Center(// 读取获取到的 idchild: Text("详情页面${arguments['id']}"),),);}}
router 封装:
// 把所有的路由统一一个文件管理起来import 'package:flutter/material.dart';import '../pages/Tabs.dart';import '../pages/home.dart';import '../pages/search.dart';import '../pages/detail.dart';import '../pages/me.dart';final routes = {'/': (context) => MyBottomNavigationBar(),'/home': (context) => HomePage(),'/search': (context) => SearchPage(),'/detail': (context, {arguments}) => DetailPage(arguments: arguments),'/me': (context, {arguments}) => MePage(arguments: arguments),};//固定写法var 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;}}};// 在main.dart 中引用这个文件import 'package:flutter/material.dart';import 'routes/routes.dart'; // 引入刚刚封装好的路由文件void main() => runApp(MyApp());class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: 'Retrieve Text Input',// home: MyBottomNavigationBar(), 初始化的时候默认加载后 这个方式可以注释掉了initialRoute: '/', // 初始化的时候加载的路由onGenerateRoute: onGenerateRoute, // 使用这个命名路由传参的方法);}}
