import 'package:common_utils/common_utils.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:wow_english/common/extension/string_extension.dart'; import 'package:wow_english/common/request/dao/user_dao.dart'; import 'package:wow_english/common/request/exception.dart'; import 'package:wow_english/utils/loading.dart'; import 'package:wow_english/utils/toast_util.dart'; part 'login_event.dart'; part 'login_state.dart'; enum LoginType { ///密码登陆 pwd, ///验证码登陆 sms, } class LoginBloc extends Bloc { bool _canLogin = false; ///是否可以发送验证码 bool _canSendSms = false; ///是否阅读协议 bool _agreement = false; ///登陆方式 //LoginType _loginType = LoginType.sms; bool _isSmsLoginType = true; final TextEditingController phoneNumController = TextEditingController(); final TextEditingController checkNumController = TextEditingController(); bool get canLogin => _canLogin; bool get agreement => _agreement; //LoginType get loginType => _loginType; bool get isSmsLoginType => _isSmsLoginType; bool get canSendSms => _canSendSms; LoginBloc() : super(LoginInitial()) { on(_requestLoginApi); on(_changeLoginType); on(_changePhoneNumber); on(_agreementTypeChange); on(_checkFiledChange); on(_requestSmsCodeApi); } ///请求登陆 void _requestLoginApi(RequestLoginEvent event, Emitter emitter) async { var phoneNumber = phoneNumController.text; if (phoneNumber.isEmpty) { showToast('号码不能为空'); return; } var checkNumber = checkNumController.text; if (checkNumber.isEmpty) { var text = _isSmsLoginType ? '密码' : '验证码'; showToast('$text不能为空'); return; } var checkKey = _isSmsLoginType ? 'smsCode' : 'password'; var type = _isSmsLoginType ? 'sms_code' : 'pwd'; try { await loading(() async { var user = await UserDao.login(phoneNumber, type, checkKey, checkNumber); if (kDebugMode) { print('登陆 UserEntity=$user'); } emitter.call(LoginResultChangeState()); }); } catch (e) { if (kDebugMode) { print(e); } showToast('登陆失败${(e as ApiException?)?.message?.prefixColon}'); } } ///请求验证码 void _requestSmsCodeApi(RequestSmsCodeEvent event, Emitter emitter) async { final phoneNumber = phoneNumController.text; if (!RegexUtil.isMobileExact(phoneNumber)) { showToast('请检查手机号'); return; } try { await loading(() async { await UserDao.sendCode(phoneNumber); }); emitter(SmsCodeRequestState()); } catch (e) { if (kDebugMode) { print(e); } showToast('获取验证码失败${(e as ApiException?)?.message?.prefixColon}'); } } ///切换登陆方式 void _changeLoginType(ChangeLoginTypeEvent event, Emitter emitter) async { if (_isSmsLoginType) { _isSmsLoginType = false; } else { _isSmsLoginType = true; } checkNumController.clear(); if (_loginStateChange()) { emitter(LoginEventChangeState()); } emitter(LoginTypeChangeState()); } ///手机号输入 void _changePhoneNumber(PhoneNumChangeEvent event, Emitter emitter) async { if (phoneNumController.text.isNotEmpty) { if (!_canSendSms) { _canSendSms = true; emitter(SmsSendTypeChangeState()); } if (_loginStateChange()) { emitter(LoginEventChangeState()); } } else { if (_canSendSms) { _canSendSms = false; emitter(SmsSendTypeChangeState()); } if (_loginStateChange()) { emitter(LoginEventChangeState()); } } } ///验证码/密码输入变化 void _checkFiledChange(CheckFieldChangeEvent event, Emitter emitter) async { if (_loginStateChange()) { emitter(LoginEventChangeState()); } } ///是否阅读协议 void _agreementTypeChange(AgreementChangeEvent event, Emitter emitter) async { _agreement = !_agreement; emitter(AgreementTypeChangeState()); if (_loginStateChange()) { emitter(LoginEventChangeState()); } } ///登陆状态判断 bool _loginStateChange() { if (_agreement) { if (phoneNumController.text.isNotEmpty && checkNumController.text.isNotEmpty) { if (!_canLogin) { _canLogin = true; return true; } } else { if (_canLogin) { _canLogin = false; return true; } } } else { if (_canLogin) { _canLogin = false; return true; } } return false; } }