我观看 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;
},
),
但是没有成功。
为此,您可以使用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(),
),
);