我正在尝试在我的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中尝试了无状态小部件和有状态小部件。
我可以编写一些代码来替换按钮,以便它在没有用户输入的情况下运行吗?
答案 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的更多信息,请参见: