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

问题描述 投票:0回答:1

我有一个使用共享首选项包存储数据的应用程序。我希望如果用户第一次访问应用程序,则显示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
 }
}
flutter dart flutter-layout dart-pub
1个回答
0
投票

之所以这样,是因为您的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())
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.