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);
}
转载于:https://www.cnblogs.com/ajanuw/p/11029245.html