如何在用户重新启动应用程序时保持用户登录状态?

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

我观看 freecodecamp 教程:https://youtu.be/njLEDvoDjtk?t=7598

在此时间标记他的代码以继续使用

home: ref.watch(currentuserProvider).when(
          data: (data) {
            if (data != null) {
              return HOme_Viewer();
            } else {
              return signup();
            }
          },
          error: (error, stackTrace) => Text(error.toString()),
          loading: () {
            return CircularProgressIndicator.adaptive();
          }),

我想采用相同的方法,但使用 go_router 包,所以我尝试:

 final app = ref.watch(currentuserProvider).value;
  return GoRouter(
    initialLocation: '/',
    routes: [
      GoRoute(
        path: signup.route,
        name: "Signup",
        builder: (BuildContext context, GoRouterState state) {
          return signup();
        },
        redirect: (context, state) {
          if (app != null) {
            return HOme_Viewer.route;
          }
          return null;
        },
      ),

但是没有成功。

flutter flutter-go-router
1个回答
0
投票

为此,您可以使用SharedPreferences。创建另一个名为 Wrapper 的文件,然后将逻辑放入其中,

包装:

@override
  void initState() {
    super.initState();
    isLogin();
  }

  void isLogin() async {
    SharedPreferences sp = await SharedPreferences.getInstance();
    bool? isLogin = sp.getBool('isLogin') ?? false;
    if(isLogin){
      Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) => const HomePage(),),);
    }else{
      Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) => const LoginPage(),),);
    }
  }

  @override
  Widget build(BuildContext context) {
    return const Scaffold(
      body: Center(child: CupertinoActivityIndicator()),
    );
  }

这里你只需要创建

SharedPreferences
的实例并获取布尔值来检查用户是否登录。

登录页面:

SharedPreferences sp = await SharedPreferences.getInstance();
  sp.setBool('isLogin', true);
  Navigator.pushReplacement(
    context,
    MaterialPageRoute(
    builder: (context) => const HomePage(),
  ),
);

现在在您的

LoginPage
中,您只需将该布尔值设置为登录用户的 true 即可。

主页:

String email = '';

@override
void initState() {
  super.initState();
  loadData();
}

loadData() async {
  SharedPreferences sp = await SharedPreferences.getInstance();
  email = sp.getString('email') ?? '';
  setState(() {});
}

注销:

SharedPreferences sp = await SharedPreferences.getInstance();
sp.clear();
Navigator.pushReplacement(context,
    MaterialPageRoute(
      builder: (context) => const LoginPage(),
    ),
);
© www.soinside.com 2019 - 2024. All rights reserved.