import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( /// 提供处理命名路由的函数。 使用此功能识别被推送的命名路由,并建立正确的路由屏幕 onGenerateRoute: (settings) { if (settings.name == PassArgumentsScreen.routeName) { /// 将参数转换为正确的类型:ScreenArguments final ScreenArguments args = settings.arguments; // 而后,从参数中提取所需的数据,将数据传递到正确的页面 return MaterialPageRoute( builder: (context) { return PassArgumentsScreen( title: args.title, message: args.message, ); }, ); } }, title: 'Navigation with Arguments', home: HomeScreen(), ); } } class HomeScreen extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Home Screen'), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ /// 导航到指定路线的按钮。 命名路线,本身提取参数。 RaisedButton( child: Text("提取参数"), onPressed: () { Navigator.push( context, MaterialPageRoute( builder: (context) => ExtractArgumentsScreen(), settings: RouteSettings( arguments: ScreenArguments( '提取参数', 'This message is extracted in the build method.', ), ), ), ); }, ), /// 提取onGenerateRoute函数中的参数并传递它们到页面 RaisedButton( child: Text("接收参数"), onPressed: () { Navigator.pushNamed( context, PassArgumentsScreen.routeName, arguments: ScreenArguments( '接收参数', 'This message is extracted in the onGenerateRoute function.', ), ); }, ), ], ), ), ); } } /// 一个Widget,它从ModalRoute中提取必要的参数 class ExtractArgumentsScreen extends StatelessWidget { static const routeName = '/extractArguments'; @override Widget build(BuildContext context) { final ScreenArguments args = ModalRoute.of(context).settings.arguments; return Scaffold( appBar: AppBar( title: Text(args.title), ), body: Center( child: Text(args.message), ), ); } } /// 一个Widget,它经过构造函数接受必要的参数 class PassArgumentsScreen extends StatelessWidget { static const routeName = '/passArguments'; final String title; final String message; const PassArgumentsScreen({ Key key, @required this.title, @required this.message, }) : super(key: key); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(title), ), body: Center( child: Text(message), ), ); } } class ScreenArguments { final String title; final String message; ScreenArguments(this.title, this.message); }