Flutter Getx上手之用户登录态管理

1,387 阅读2分钟

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);
  }
}
​

登录态控制器

  1. 读取本地登录态
  2. 已登录去服务器校验登录态
  3. 登录态校验通过更新全局登录
  4. 校验未通过登出并更新全局登录
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(),
        )

至此登录态管理应该都可以了,代码拷贝应该就可以用