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 == '/');返回。

相关推荐
顾林海4 分钟前
Android文件系统安全与权限控制:给应用数据上把“安全锁”
android·面试·操作系统
linweidong4 分钟前
C++ 中避免悬挂引用的企业策略有哪些?
java·jvm·c++
青莲8435 分钟前
Android 动画机制完整详解
android·前端·面试
城东米粉儿5 分钟前
android 离屏预渲染 笔记
android
用户93761147581616 分钟前
并发编程三大特性
java·后端
阿在在7 分钟前
Spring 系列(二):加载 BeanDefinition 的几种方式
java·后端·spring
未知名Android用户9 分钟前
Android自定义 View + Canvas—声纹小球动画
android
小当家.10515 分钟前
Maven与Gradle完整对比指南:构建工具深度解析
java·gradle·maven
neoooo22 分钟前
🍃Spring Boot 多模块项目中 Parent / BOM / Starter 的正确分工
java·后端·架构
黄金贼贼23 分钟前
2026最新java单元测试json校验器
java·单元测试·json