Getx 用户登录态管理
有段时间没有写Flutter了,最近看到各种Getx状态管理文章,试了一下,的确是挺方便的
自己做个Demo的时候,一个场景把我困扰了一天,就是用户登录态的管理,以前的方式是用 ChangeNotifier
,参考的这边文章
按理Getx状态管理这么方便,应该会有很好的方式来做,没找到其他的文章,干脆自己摸索分享一下,权当抛砖引玉了。 Getx部分的,刚接触,了解不深,就不献丑了
首先是用户登录态的保存
user_token_entity:用户登录信息Model
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:sp_util/sp_util.dart';
import 'package:tfapp/user_manager/user_token_entity.dart';
const String tokenKey = 'userToken';
class UserManager {
static final UserManager _userManager = UserManager._internal();
static UserManager get instance => UserManager();
factory UserManager(){
return _userManager;
}
UserTokenEntity? userTokenEntity;
UserManager._internal();
bool get isLogin {
if (userTokenEntity == null) {
return false;
} else {
return true;
}
}
UserTokenEntity get tokenEntity {
return userTokenEntity!;
}
/// 保存token到内存和本地
saveUserToken(UserTokenEntity entity) {
userTokenEntity = entity;
SpUtil.putObject(tokenKey, entity);
}
/// 加载本地缓存token
UserTokenEntity? loadLocalToken() {
UserTokenEntity? entity = SpUtil.getObj(tokenKey, (v) => UserTokenEntity.fromJson(v as Map<String, dynamic>));
userTokenEntity = entity;
return entity;
}
/// 登出
logout() {
userTokenEntity = null;
loginEntity = null;
SpUtil.remove(tokenKey);
}
}
登录态控制器
- 读取本地登录态
- 已登录去服务器校验登录态
- 登录态校验通过更新全局登录
- 校验未通过登出并更新全局登录
import 'package:get/get.dart';
import 'package:tfapp/pages/home/home/logic.dart';
import 'package:tfapp/user_manager/user_manager.dart';
import 'package:tfapp/user_manager/user_token_entity.dart';
import 'package:tfapp/http/net.dart';
class UserControllerBinding implements Bindings {
@override
void dependencies() {
Get.lazyPut<UserController>(() => UserController());
}
}
class UserController extends GetxController {
var tokenEntiy = UserTokenEntity().obs;
var loginState = false.obs;
logout(){
loginState.value = false;
UserManager.instance.logout();
update();
}
/*用户token同步*/
login(UserTokenEntity userTokenEntity) {
tokenEntiy.value = userTokenEntity;
loginState.value = true;
UserManager.instance.saveUserToken(userTokenEntity);
/// 首页的用户状态需求更新
HomeLogic homeLogic = Get.find<HomeLogic>();
homeLogic.state.refreshController.requestRefresh();
update();
}
/*加载本地用户Token*/
localUserToken() {
UserTokenEntity? entity = UserManager.instance.loadLocalToken();
if (entity != null) {
tokenEntiy.value = entity;
loginState.value = true;
update();
localUserInfo();
}
}
loadNetUserInfo() {
if (loginState.value == true) {
asyncRequestNetwork<UserTokenEntity>('', onSuccess: (data){
/// 用户登录态未过期可以接着使用
tokenEntiy.value = data!;
loginState.value = true;
update();
}, onError: (code, msg){
});
}
}
@override
void onInit() {
// TODO: implement onInit
super.onInit();
localUserToken();
}
}
页面状态更新
GetBuilder<UserController>(builder: (logic){
if (logic.loginState.value == true ) {
//已登录
} else {
// 未登录
}
},),
用户登录动作
登录成功,将登录信息同步
Get.find<UserController>().login(data!);
用户登出动作
登出,清除登录态
Get.find<UserController>().logout();
绑定登录态控制器
在main入口 GetMaterialApp initialBinding
GetMaterialApp(
initialRoute: AppRoutes.splash, /// app 入口
enableLog: const bool.fromEnvironment('dart.vm.product'),
getPages: appRoutes,
builder: EasyLoading.init(),
navigatorObservers: [GetXRouterObserver()],
initialBinding: UserControllerBinding(),
)
至此登录态管理应该都可以了,代码拷贝应该就可以用