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

相关推荐
Wang's Blog3 小时前
Java 项目实战: 外卖平台优化-Nginx配置文件结构与块层级
java·开发语言·nginx
\光辉岁月/4 小时前
5.java-数组
java·开发语言
谢亮_vipxieliang5 小时前
Spring 事务失效的常见场景
java·开发语言·数据库·spring boot
郑州光合科技余经理5 小时前
海外版外卖加盟:总站与分站配送规则怎么分开管
java·开发语言·前端·后端·uni-app·php·ai编程
2601_962071575 小时前
类变量和全局变量的生命周期有什么区别?
java·开发语言·jvm
code2cat5 小时前
Java进阶篇之AtomicReference:一次替换引用,读到一份完整状态
java·并发编程·不可变对象·atomicreference
专业程序开发源5 小时前
springboot简历管理系统81389-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·spring·php·课程设计
Wang's Blog5 小时前
Java 项目实战: 外卖平台优化-前后端分离开发模式与工程拆分
java·开发语言
HEJOO96 小时前
指针的算术运算详解
java·数据结构·算法
sunshine22 girl6 小时前
Java学习六 Java常见API-2--String-3-字符串的截取替换和其他方法
java·开发语言·学习