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

相关推荐
YH55269841 天前
GPT‑5.6 Sol 原本支持 1M 上下文,Codex 现已放开此前限制,如何看待这次调整?
java·jvm·人工智能·gpt·算法·chatgpt
AI_小站1 天前
刚面完百度的 Agent 开发岗,我才发现:世界就是个巨大的草台班子
java·开发语言·人工智能·spring·百度·langchain
许彰午1 天前
03-三种开发模式
java·架构
Rain的Java大神之路1 天前
短信接口被狂刷怎么处理
java·运维·后端·web安全·面试·架构·xss
2602_959960921 天前
谢飞机面试大厂:Spring Boot、JVM、Redis、Kafka、微服务与音视频搜索场景求生实录
java·jvm·spring boot·redis·面试题
Zane1994121 天前
CAS 与原子类:Java 如何实现无锁编程
java·开发语言
略略略咯咯1 天前
AI玩具-study
java
FinelyYang1 天前
UniApp + LiveKit:Android 端为什么要用原生做屏幕共享,以及我们怎么落地的
android·uni-app
蓝速科技1 天前
蓝速科技信创落地:平衡安全合规与项目成本的实战方案
android·运维·人工智能·科技·安全·电脑·鸿蒙
xier_ran1 天前
【infra之路】GPU 存储层次总结:L1 / L2 / HBM
java·网络·数据库