flutter - 共享偏好:如果用户已经访问过应用程序,我如何将用户发送到主屏幕?
问题描述
我有一个应用程序,我在其中使用共享首选项包来存储数据。我希望如果用户第一次访问应用程序,则显示 WelcomeScreen,否则显示 HomeScreen。我在按钮的 OnPressed 方法上调用了 shared_preferences 方法,但问题已经出现在欢迎屏幕上。我也使用了 initSate,使用 initSate 也显示错误。
这是我没有 initSate 的代码,但由于我已经欢迎屏幕,所以每次我回到同一个屏幕。
class WelcomeScreen extends StatefulWidget {
@override
_WelcomeScreenState createState() => _WelcomeScreenState();
}
class _WelcomeScreenState extends State<WelcomeScreen> {
@override
Widget build(BuildContext context) {
return FlatButton(
onPressed: () async {
bool visitingFlag = await Provider.of<MainProvider>(context, listen: false).getVisitingUser();
if(visitingFlag == true){
Navigator.pushReplacementNamed(
context, HomeScreen.routeName );
}
else{
Navigator.pushReplacementNamed(
context, welcomeScreen.routeName);
}
},
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'Continue',
style: TextStyle(
fontSize: 24,
color: Theme.of(context)
.primaryTextTheme
.bodyText2
.color,
),
),
Icon(
Icons.arrow_right,
size: 30,
color:
Theme.of(context).primaryTextTheme.bodyText2.color,
),
],
),
);
}
}
这是我的带有 initSate 的代码,但显示错误:
class WelcomeScreen extends StatefulWidget {
@override
_WelcomeScreenState createState() => _WelcomeScreenState();
}
class _WelcomeScreenState extends State<WelcomeScreen> {
@override
void initState() {
// TODO: implement initState
super.initState();
visitingMethod();
}
void visitingMethod() async{
bool visitingFlag = await Provider.of<MainProvider>(context, listen: false).getVisitingUser();
if(visitingFlag == true){
Navigator.pushReplacementNamed(
context, HomeScreen.routeName);
}
else{
Navigator.pushReplacementNamed(
context, WelcomeScreen.routeName);
}
}
@override
Widget build(BuildContext context) {
return Container(); // more same code
}
}
解决方案
发生这种情况是因为您visitingMethod
是异步的。我的建议:
class _WelcomeScreenState extends State<WelcomeScreen> {
// create a variable to control build
bool loadWelcome = false;
@override
void initState() {
// TODO: implement initState
super.initState();
visitingMethod();
}
void visitingMethod() async{
bool visitingFlag = await getVisitingUser();
setVisitingUser();
if(visitingFlag == true){
Navigator.pushReplacementNamed(context, HomeScreen.routeName);
} else {
setState(() {
loadWelcome = true;
});
}
}
@override
Widget build(BuildContext context) {
return (loadWelcome? (
// here the welcome widgets tree
) : Container())
}
}
推荐阅读
- java - 如何将图像传输到另一个活动
- python - 在python中从一个数据帧中选择并将值添加到另一个数据帧
- open-policy-agent - 从 Rego 中的一串元素创建一个集合
- php - Laravel 中路由未定义异常但路由已定义
- python - 如何对 3 个整数执行所有可能的算术运算组合?
- xcode - 如何在 SwiftUI 上像滑块一样填充图像
- python - 正则表达式在许多字符串之间添加间距
- r - 用txt获取信息
- react-native - React Native:如何让 Modal 和 KeyboardAvoidingView 动画更快?
- javascript - React Native 我无法通过承诺得到结果