flutter - 将上下文和字符串传递给 MaterialPageRoute 的函数
问题描述
if (_seen) {
print("Welcome back");
Navigator.of(context).pushReplacement(
MaterialPageRoute(builder: (context) => HomeScreen()));
}
我有一个 Flutter 应用程序,我在其中使用 SharedPreferences 来检查它是否是用户第一次打开应用程序。如果变量 _seen 为真,它会将它们发送到 HomeScreen。我想使用另一个 dart 文件中的函数来执行此操作 - functions.dart来编写更清晰的代码。
我可以在functions.dart中有这样的功能吗:
void Navigator(context, String pageName) {
Navigator.of(context).pushReplacement(
MaterialPageRoute(builder: (context) => $pageName()));
}
这样我就可以像这样通过它?
if (_seen) {
print("Welcome back");
Navigator(context, "HomeScreen");
}
解决方案
您需要在MaterialApp
其中定义一个映射 stringName -> Widget 的地图,并使用Navigator.pushNamed
(或类似)方法进行“导航”
这是您的操作方法:
Future<T> goToPage<T>(BuildContext context, String pageName) => Navigator.pushNamed<T>(context, pageName);
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Demo',
routes: {
"one": (context) => PageOne(),
"two": (context)=> PageTwo(),
},
initialRoute: "one",
);
}
}
class PageOne extends StatelessWidget{
@override
Widget build(BuildContext context){
return Scaffold(
appBar: AppBar(
title: Text("PageOne"),
),
body: Center(
child: RaisedButton(
child: Text("Go to PageTwo"),
onPressed: ()=> goToPage(context, "two"),
),
),
);
}
}
class PageTwo extends StatelessWidget{
@override
Widget build(BuildContext context){
return Scaffold(
appBar: AppBar(
title: Text("PageTwo"),
),
body: Center(
child: RaisedButton(
child: Text("Go to PageOne"),
onPressed: ()=> goToPage(context, "one"),
),
),
);
}
}
推荐阅读
- sql - 带有 unix 时间戳的 BigQuery PARSE_TIMESTAMP - 无法解析输入字符串
- ruby-on-rails - Rails 6 simple_form 接收哈希
- node.js - 将私有注册表与 .npmrc 一起使用
- excel - 循环时无法重复获取指定单元格中包含的值
- sql-server - 将表复制到数据库中
- windows - AWS Windows userdata powershell 不工作
- javascript - 引导模式弹出窗口未显示在索引页面上
- flutter - 忽略在 pubspec.yaml 中找不到资产的文件或变体
- sql-server - 为 NamedParameterJdbcTemplate 分配的参数未采用
- java - 使用具有多个对象的单个线程?