共享首选项:如果用户已经访问过应用程序,我如何将用户发送到主屏幕?

shared preferences : how can i send user to homescreen if user visited app already?

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