flutter - Flutter 屏幕的条件渲染
问题描述
我正在尝试在应用程序打开时实现屏幕的有条件显示。
在 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
或WelcomePage screen
.
更新
首先,我非常感谢给出的答案。这两者都有帮助,但我认为另一个答案是我正在考虑的答案。但我这样做是这样的:
主要.dart
Future main() async {
WidgetsFlutterBinding.ensureInitialized();
SharedPreferences prefs = await SharedPreferences.getInstance();
_username = prefs.getString("username");
...
}
return Materialapp(
...
home: _username == null ? LoginPage() : WelcomePage()
...
);
我不认为这是否是正确的方法之一。任何意见/建议将不胜感激。
解决方案
因此,根据我的理解,如果用户以共享偏好退出,您正在尝试确保在启动屏幕之后将用户重定向到适当的页面。所以你可以做的是把 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);
}
}
所以在你的启动屏幕页面中你可以这样做......添加一个计时器,当计时器完成时执行以检查用户
推荐阅读
- css - 在 React 组件中设置背景图像
- spring - SPeL - 设置一个应该在一个空列表中的对象的值
- mysql - PySpark 和 MySQL 选项
- bigbluebutton - 如何在 BigBlueButton 中启用停止录制按钮?
- javascript - 使用来自不同类的类对象
- r - 通过求解受等式约束的不等式系统在 R 中建立套利策略
- apache-spark - mapGroupsWithState 中的火花流理解超时设置
- python - 计算列之间的相关性产生错误:不支持的操作数/无法转换系列
- tags - 内核源代码树的 ctags 或类似的标记系统
- flutter - Flutter:为什么表单(编辑页面)在提交并保存表单数据后重新加载,然后导航到其他地方