user_bloc.dart 3.39 KB
import 'package:flutter/widgets.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:wow_english/common/core/user_util.dart';
import 'package:wow_english/common/request/dao/user_dao.dart';
import 'package:wow_english/models/user_entity.dart';
import 'package:wow_english/pages/user/modify/modify_user_information_page.dart';
import 'package:wow_english/utils/log_util.dart';

part 'user_event.dart';
part 'user_state.dart';

class UserBloc extends Bloc<UserEvent, UserState> {
  final TextEditingController modifyTextController = TextEditingController();
  int tempGender = 0;
  UserEntity? _userEntityForPay;

  UserEntity? get userEntityForPay => _userEntityForPay;

  bool exchangeResult = false;
  UserBloc() : super(UserInitial()) {
    on<UserLogout>(_logout);
    on<UserDelete>(_deleteAccount);
    on<UserUpdate>(_updateUser);
    on<UserUIUpdate>(_updateUIUser);
    on<PayStateChangeEvent>(_patStateChanged);
  }

  void _logout(UserLogout event, Emitter<UserState> emitter) async {
    await UserDao.logout();
  }

  void _deleteAccount(UserDelete event, Emitter<UserState> emitter) async {
    await UserDao.deleteAccount();
  }

  void _updateUIUser(UserUIUpdate event, Emitter<UserState> emitter) async {
    emitter(UserInfoUpdated());
  }

  void _updateUser(UserUpdate event, Emitter<UserState> emitter) async {
    Log.d(
        '_updateUser, event: ${event.type}, emitter.isDone: ${emitter.isDone}, text=${event.content}');
    UserEntity user = UserUtil.getUser()!;
    try {
      switch (event.type) {
        case ModifyUserInformationType.avatar:
          String avatarUrl = event.content;
          await UserDao.updateUserInfoField(avatarUrl: avatarUrl);
          // 修改成功,更新本地缓存及UI
          user.avatarUrl = avatarUrl;
          emitter(UserInfoUpdated());
          break;
        case ModifyUserInformationType.name:
          String name = event.content;
          await UserDao.updateUserInfoField(name: name);
          // 修改成功,更新本地缓存及UI
          user.name = name;
          emitter(UserInfoUpdated());
          break;
        case ModifyUserInformationType.age:
          // todo 校验格式
          int age;
          try {
            age = int.parse(event.content);
          } catch (e) {
            Log.w(e.toString());
            throw '年龄格式错误';
          }
          await UserDao.updateUserInfoField(age: age);
          // 修改成功,更新本地缓存及UI
          user.age = age;
          emitter(UserInfoUpdated());
          break;
        case ModifyUserInformationType.gender:
          var gender = int.parse(event.content);
          await UserDao.updateUserInfoField(gender: gender);
          user.gender = gender;
          emitter(UserInfoUpdated());
          break;
      }
      // 服务器保存成功后本地再保存一下
      UserUtil.saveUser(user);
    } catch (e) {
      Log.e('修改个人信息失败: $e');
    }
  }

  //支付状态变化
  void _patStateChanged(
      PayStateChangeEvent event, Emitter<UserState> emitter) async {
    // 由于userInfo接口不会返回token,所以这里需要再次保存一下token
    final token = UserUtil.getUser()?.token;
    _userEntityForPay = await UserDao.getUserInfo();
    if (_userEntityForPay == null) {
      return;
    }
    _userEntityForPay?.token = token;
    UserUtil.saveUser(_userEntityForPay);
    emitter(UserPayStateChangedState());
  }
}