我们可以使用Flutter中的Navigator类的加强版 - Navigator 2.0来解决这个问题。Navigator 2.0为Flutter应用程序提供了更多的路由和屏幕导航选项,包括可以在应用程序中的不同页面间自定义路由实现的、更强大、更灵活和更可扩展的框架。
下面是一个简单的示例,演示如何使用Navigator 2.0来解决这个问题:
// 声明路由命名
class RouteName {
static const String home = "/";
static const String detail = "/detail";
}
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
// 设置主页路由
initialRoute: RouteName.home,
// 声明路由表
routes: {
RouteName.home: (context) => HomeScreen(),
RouteName.detail: (context) => DetailScreen(),
},
// 路由生成器
onGenerateRoute: (settings) {
switch (settings.name) {
case RouteName.home:
return MaterialPageRoute(builder: (context) => HomeScreen());
case RouteName.detail:
// 获取传递的参数
var arguments = settings.arguments;
return MaterialPageRoute(builder: (context) => DetailScreen(arguments));
}
return null;
},
);
}
}
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: [
Text(
'Home',
),
RaisedButton(
child: Text("Details"),
onPressed: () {
Navigator.of(context).pushNamed(RouteName.detail, arguments: {"name": "Ricardo", "age": 18});
},
),
],
),
),
);
}
}
class DetailScreen extends StatelessWidget {
final Map arguments;
DetailScreen(this.arguments);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Detail Screen"),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'Name: ${arguments["name"]}',
),
Text(
'Age: ${arguments["age"]}',
),
RaisedButton(
child: Text("Back"),
onPressed: () {
上一篇:编程实践:笔记本电脑价格清单问题