我有一个使用共享首选项包存储数据的应用程序。我希望如果用户第一次访问应用程序,则显示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())
}
}