Flutter:切换账号功能记录

登录页

js 复制代码
  // 账号
  TextEditingController accountController = TextEditingController();
  // 密码
  TextEditingController passwordController = TextEditingController();
  // 用户信息
  UserUserinfoModel userInfo = UserUserinfoModel();
  // 登录历史
  List<LoginHistoryModel> loginHistoryList = [];
  // 是否切换账号
  bool isSwitch = false;
  
  // 登录
  void submit() async {
    if (accountController.text.isEmpty) return Loading.toast('请输入账号');
    if (passwordController.text.isEmpty) return Loading.toast('请输入登录密码');
    Loading.show();
    var res = await UserApi.login(UserLoginReq(
      account: accountController.text,
      password: passwordController.text,
    ));
    if (res.token!.isNotEmpty) {
      await Storage().setString('token', res.token!);
      userInfo = await UserApi.getUserInfo();

      // 如果登录历史不为空,筛选account是否有重复的则删除,否则正常添加
      if (loginHistoryList.isNotEmpty) {
        loginHistoryList.removeWhere((element) => element.amount == accountController.text);
      }
      
      // 本地存入登录历史
      loginHistoryList.add(LoginHistoryModel(
        account: accountController.text,
        password: passwordController.text,
        avatarUrl: userInfo.avatar,
        nickname: userInfo.nickname,
      ));
      
      await Storage().setJson('loginHistoryList', loginHistoryList);

      Loading.success('登录成功');
      if(isSwitch) {
        // 如果是切换账号,返回tabbar
        Get.until((route) => route.settings.name == '/');
      } else {
        Get.offAllNamed('/');
      }

    }
    update(["login"]);
  }

切换账号页

js 复制代码
import 'dart:convert';

import 'package:get/get.dart';
import 'package:xinghuodarong/common/index.dart';
import 'package:xinghuodarong/pages/tab/main/index.dart';
class SwitchAccountController extends GetxController {
  SwitchAccountController();
  // 登录历史
  List<LoginHistoryModel> loginHistoryList = [];
  // 用户信息
  UserUserinfoModel userInfo = UserUserinfoModel();

  // 管理开启
  bool isManage = false;

  // 切换管理
  void onManage() {
    isManage = !isManage;
    update(["switch_account"]);
  }

  _initData() async{
    // 获取登录历史
    var stringLoginHistoryList = Storage().getString('loginHistoryList');
    loginHistoryList = stringLoginHistoryList !="" ? jsonDecode(stringLoginHistoryList).map<LoginHistoryModel>((item){
      return LoginHistoryModel.fromJson(item);
    }).toList() : [];

    // 获取用户信息
    userInfo = await UserApi.getUserInfo();
    update(["switch_account"]);
  }


  @override
  void onReady() {
    super.onReady();
    _initData();
  }

  // 删除
  void onDel(LoginHistoryModel item) {
    loginHistoryList.remove(item);
    Storage().setJson('loginHistoryList', loginHistoryList);
    Loading.success('删除成功');
    isManage = false;
    update(["switch_account"]);
  }

  // 切换
  void onSwitch(LoginHistoryModel item) async {
    Loading.show();
    try {
      // 先尝试登录
      var res = await UserApi.login(UserLoginReq(
        account: item.amount,
        password: item.password,
      ));
      
      if (res.token!.isNotEmpty) {
        // 清除旧token
        await Storage().remove('token');
        // 存新token
        await Storage().setString('token', res.token!);
        
        Loading.success('切换成功');
        Get.until((route) => route.settings.name == '/');
      } else {
        Loading.error('登录失败');
      }
    } catch (e) {
      Loading.error('切换失败');
    }
  }
}

路由规则,/ -> 设置页 -> 切换账号页

最后由登录页的Get.until((route) => route.settings.name == '/');返回。

相关推荐
明天不下雨(牛客同名)2 小时前
为什么 ThreadLocalMap 的 key 是弱引用 value是强引用
java·jvm·算法
多多*2 小时前
Java设计模式 简单工厂模式 工厂方法模式 抽象工厂模式 模版工厂模式 模式对比
java·linux·运维·服务器·stm32·单片机·嵌入式硬件
胡图蛋.4 小时前
Spring Boot 支持哪些日志框架?推荐和默认的日志框架是哪个?
java·spring boot·后端
牛马baby4 小时前
Java高频面试之并发编程-01
java·开发语言·面试
小小大侠客4 小时前
将eclipse中的web项目导入idea
java·eclipse·intellij-idea
不再幻想,脚踏实地4 小时前
MySQL(一)
java·数据库·mysql
吃海鲜的骆驼4 小时前
SpringBoot详细教程(持续更新中...)
java·spring boot·后端
迷雾骑士5 小时前
SpringBoot中WebMvcConfigurer注册多个拦截器(addInterceptors)时的顺序问题(二)
java·spring boot·后端·interceptor
鸿蒙布道师5 小时前
鸿蒙NEXT开发Base64工具类(ArkTs)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei
别来无恙✲5 小时前
Mybatis源码分析
java·源码分析