首次启动时启动欢迎屏幕

时间:2020-03-27 15:27:19

标签: flutter dart

我正在尝试在我的App首次启动时显示一些欢迎屏幕。之后它将进入登录屏幕。但是为了提高效率,我需要它在启动登录屏幕之前将所有欢迎屏幕弹出“堆栈”,这就是此请求的原因。 我的main.dart程序加载到preloader2.dart中,如下所示:

class PreLoad2 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    String myRoute;
    return Scaffold(
      body: SafeArea(
        child: FlatButton(
          child: Text('Press me!'),
          onPressed: () {
            if (loginCount == 0) {         // globally defined variable
              myRoute = '/welcome1';
            } else {
              myRoute = '/login';
            }
            ++loginCount;
            Navigator.pushNamed(context, myRoute);
          },
        ),
      ),
    );
  }
}

效果很好。但是我必须单击按钮。 我在preload2中尝试了无状态小部件和有状态小部件。

我可以编写一些代码来替换按钮,以便它在没有用户输入的情况下运行吗?

2 个答案:

答案 0 :(得分:1)

只需在返回脚手架之前将onPressed主体放入构建函数中

@override
  Widget build(BuildContext context) {
    String myRoute;
    if (loginCount == 0)         // globally defined variable
        myRoute = '/welcome1';
    else
       myRoute = '/login';
    ++loginCount;
    Navigator.pushNamed(context, myRoute);
    return Scaffold(
      body: SafeArea(
        child: FlatButton(
          child: Text('Press me!'),
          onPressed: () {
           // Nothing Here
          },
        ),
      ),
    );
  }
}

答案 1 :(得分:0)

我设法解决了这个问题,而不是回答我自己的问题。 在main.dart程序中,我添加了一个新的Welcome Widget。这是要设置一个新的导航器,该导航器依次调用我的每个欢迎屏幕。每一个依次被推然后弹出。因此,这并不是我所追求的,但绝对可以解决问题,并且看起来非常有效。我的欢迎小部件如下所示:

class Welcome extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Navigator(
      initialRoute: 'welcome1',
      onGenerateRoute: (RouteSettings settings) {
        WidgetBuilder builder;
        switch (settings.name) {
          case 'welcome1':
            builder = (BuildContext _) => Welcome1(
                  onWelcomeComplete: () {
                    Navigator.of(context).pop();
                  },
                );
            break;
          case 'welcome2':
            builder = (BuildContext _) => Welcome2(
                  onWelcomeComplete: () {
                    Navigator.of(context).pop();
                  },
                );
            break;
          case 'welcome3':
            builder = (BuildContext _) => Welcome3(
                  onWelcomeComplete: () {
                    Navigator.of(context).pop();
                  },
                );
            break;
          case 'welcome4':
            // Assume ChooseCredentialsPage collects new credentials and then
            // invokes 'onSignupComplete()'.
            builder = (BuildContext _) => Welcome4(
                  onWelcomeComplete: () {
                    Navigator.of(context).pop();
                  },
                );
            break;
          default:
            throw Exception('Invalid route: ${settings.name}');
        }
        return MaterialPageRoute(builder: builder, settings: settings);
      },
    );
  }
}

Welcome2(),Welcome3()和Welcome4()中的每一个都保存在自己的文件中,并向后传递指向下一个小部件的链接,可以在链中前进或后退。按钮代码如下:

 onPressed: () {
        Navigator.of(context).pushReplacementNamed(routeName);
      },

例如,路由名称为“ welcome2”,然后通过switch语句链接到该路由,该语句创建到所需小部件的新路由。

在最后一个欢迎屏幕上(或在需要之前),一旦“完成”按钮调用onWelcomeComplete函数,该函数会简单地弹出完整的Navigator堆栈,而使代码遵循我在设置中设置的默认路由('/')。 MyApp小部件将我带到login.dart中的Login()小部件。代码是:

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(

      initialRoute: '/welcome',
      routes: {
        '/': (BuildContext context) => Login(),
        '/welcome': (BuildContext context) => Welcome(),
        ...

我希望这个答案能清楚地说明我的成就并能帮助其他人。
有关Flutter Navigator的更多信息,请参见:

Navigator Class