Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 我有一个关于在initstate中有条件地导航到下一页的问题_Flutter_Dart - Fatal编程技术网

Flutter 我有一个关于在initstate中有条件地导航到下一页的问题

Flutter 我有一个关于在initstate中有条件地导航到下一页的问题,flutter,dart,Flutter,Dart,我想使用共享首选项实现自动登录 我想要实现的是,一旦“LoginPage”启动,它就转到下一页,而不根据存储在共享首选项中的标志值呈现LoginPage 但是,即使实现了这些函数并从initstate调用它们,也存在无法导航的问题。有什么问题 //Login Page void autoLogIn() async { final SharedPreferences prefs = await SharedPreferences.getInstance(); final Strin

我想使用共享首选项实现自动登录

我想要实现的是,一旦“LoginPage”启动,它就转到下一页,而不根据存储在共享首选项中的标志值呈现LoginPage

但是,即使实现了这些函数并从initstate调用它们,也存在无法导航的问题。有什么问题

//Login Page
void autoLogIn() async {
    final SharedPreferences prefs = await SharedPreferences.getInstance();
    final String userId = prefs.getString('username');
    print("ddddddddddddddd");
    SocketProvider provider = Provider.of<SocketProvider>(context);

    Future.delayed(Duration(milliseconds: 100)).then((_) {**//I tried giving Delay but it still didn't work.**
      Navigator.of(context).pushNamedAndRemoveUntil("/MainPage", (route) => false);
    });
  }

  @override
  void initState() {
    // TODO: implement initState
    loginBloc = BlocProvider.of<LoginBloc>(context);

    if(!kReleaseMode){
      _idController.text = "TESTTEST";
      _passwordController.text = "1234123";
    }

    initBadgeList();
    autoLogIn();**//This is the function in question.**
    super.initState();
    print("1111111111111111");

  }
//登录页面
void autoLogIn()异步{
final SharedReferences prefs=等待SharedReferences.getInstance();
最终字符串userId=prefs.getString('username');
打印(“DDDDDDDDDDD”);
SocketProvider=provider.of(上下文);
Future.delayed(持续时间(毫秒:100))。然后(({**//)我尝试给出延迟,但它仍然不起作用**
Navigator.of(context).pushnamedremoveintill(“/MainPage”,(route)=>false);
});
}
@凌驾
void initState(){
//TODO:实现initState
loginBloc=BlocProvider.of(上下文);
如果(!kReleaseMode){
_idController.text=“TESTTEST”;
_passwordController.text=“1234123”;
}
initBadgeList();
autoLogIn();**//这就是所讨论的函数**
super.initState();
打印(“1111111111”);
}

如果用户已经登录,我认为您不应该显示登录页面小部件,然后导航到主页

我建议您在执行
wait SharedPreferences.getInstance()
时使用并显示启动屏幕或加载程序。在这种情况下,应用程序小部件应如下所示:

class App extends MaterialApp {
  App()
      : super(
            title: 'MyApp',
            ...
            home: FutureBuilder(
                future: SharedPreferences.getInstance(),
                builder: (context, snapshot) {
                  if (snapshot.data != null) {
                    final SharedPreferences prefs = snapshot.data;
                    final userId = prefs.getString('username');
                    ...
                    return userId == null ?? LoginPage() : MainPage();
                  } else {
                    return SplashScreenOrLoader();
                  }
                }));
}

但如果您仍然想先显示LoginPage,只需在上面的代码中将SplashScreenOrLoader()替换为LoginPage()。

如果用户已经登录,我认为您不应该显示LoginPage小部件,然后导航到主页面

我建议您在执行
wait SharedPreferences.getInstance()
时使用并显示启动屏幕或加载程序。在这种情况下,应用程序小部件应如下所示:

class App extends MaterialApp {
  App()
      : super(
            title: 'MyApp',
            ...
            home: FutureBuilder(
                future: SharedPreferences.getInstance(),
                builder: (context, snapshot) {
                  if (snapshot.data != null) {
                    final SharedPreferences prefs = snapshot.data;
                    final userId = prefs.getString('username');
                    ...
                    return userId == null ?? LoginPage() : MainPage();
                  } else {
                    return SplashScreenOrLoader();
                  }
                }));
}
但如果您仍然想先显示LoginPage,只需在上面的代码中将SplashScreenOrLoader()替换为LoginPage()