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); }