我正在尝试在应用打开时实现有条件的显示。
在main.dart中
return Materialapp(
...
home: WelcomePage()
...
);
在WelcomePage.dart中
isLoggedin() async {
prefs = await SharedPreferences.getInstance();
if (prefs.getString('username') == null) {
Navigator.of(context).pushAndRemoveUntil(
MaterialPageRoute(builder: (BuildContext context) => LoginPage()),
(Route<dynamic> route) => false);
}
}
问题:
-用户将打开应用程序,在启动屏幕后,WelcomePage screen
会暂时显示,然后将用户重定向到Login screen
。
这段代码可以满足我的需求,但可以满足我的需求。
我想要的是,如果用户在应用程序中没有保存的首选项,则该应用程序将不会显示WelcomePage screen
,而是有一个代码检查该应用程序将显示Login screen
还是{{1 }}。
更新
首先,我非常感谢给出的答案。两者都有帮助,但我认为另一个答案是我正在考虑的答案。但是我是这样的:
main.dart
WelcomePage screen
我不认为这是否是正确的方法之一。任何意见/建议,将不胜感激。
答案 0 :(得分:3)
因此,根据我的理解,您正在尝试确保在启动屏幕后,如果用户退出共享首选项,则该用户将被重定向到相应的页面。 因此,您可以做的是将isLoggedin方法放入初始屏幕页面中... 少打字.. 查看示例代码。 所以计时器是启动画面应持续多长时间
@override
void initState() {
super.initState();
loadData();
}
Future<Timer> loadData() async {
return new Timer(Duration(seconds: 5), isLoggedin());
}
isLoggedin() async {
prefs = await SharedPreferences.getInstance();
if (prefs.getString('username') == null) {
Navigator.of(context).pushAndRemoveUntil(
MaterialPageRoute(builder: (BuildContext context) => LoginPage()),
(Route<dynamic> route) => false);
}
}
因此,在初始屏幕页面中,您可以执行此操作... 添加一个计时器,并在计时器完成后执行以检查用户
答案 1 :(得分:2)
您可以在username
中检查main()
,然后使用initialRoute
决定要转到哪个页面
这样您就不会每次
WelcomePage screen
initialRoute: username == null ? "/welcome" : "/login",
代码段
String username;
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
SharedPreferences prefs = await SharedPreferences.getInstance();
username = await prefs.getString("username");
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
initialRoute: username == null ? "/welcome" : "/login",
routes: {
'/login': (context) => LoginPage(
title: "demo",
),
"/welcome": (context) => WelcomePage(),
},
);
}
}