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

相关推荐
:12130 分钟前
java基础
java·开发语言
曹牧1 小时前
Spring:@RequestMapping注解,匹配的顺序与上下文无关
java·后端·spring
daixin88481 小时前
cursor无法正常使用gpt5.5等模型解决方案
java·redis·cursor
_李小白2 小时前
【android opencv学习笔记】Day 2: Mat类(图片数据结构体)
android·opencv·学习
韦禾水2 小时前
记录一次项目部署到tomcat的异常
java·tomcat
曦月合一2 小时前
树莓派安装jdk、tomcat、vnc、谷歌浏览器开机自启等环境配置
java·tomcat·树莓派
jinanwuhuaguo3 小时前
OpenClaw工程解剖——RAG、向量织构与“记忆宫殿”的索引拓扑学(第十三篇)
android·开发语言·人工智能·kotlin·拓扑学·openclaw
此剑之势丶愈斩愈烈3 小时前
openssl 自建证书
java
面汤放盐3 小时前
何时使用以及何时不应使用微服务:没有银弹
java·运维·云计算
0xDevNull3 小时前
Spring Boot 自动装配:从原理到实践
java·spring boot·后端