首页 > 解决方案 > 共享偏好:如果用户已经访问过应用程序,我如何将用户发送到主屏幕?

问题描述

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

标签: flutterdartflutter-layoutdart-pub

解决方案


发生这种情况是因为您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())
  }
}

推荐阅读