首页 > 解决方案 > 将上下文和字符串传递给 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");
  }

标签: flutter

解决方案


您需要在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"),
        ),
      ),
    );
  }
}

推荐阅读