login_bloc.dart 3.66 KB
import 'package:flutter/cupertino.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:wow_english/network/api.dart';
import 'package:wow_english/network/network_manager.dart';

part 'login_event.dart';
part 'login_state.dart';

enum LoginType {
  ///密码登陆
  pwd,
  ///验证码登陆
  sms,
}

class LoginBloc extends Bloc<LoginEvent, LoginState> {

  bool _canLogin = false;
  ///是否可以发送验证码
  bool _canSendSms = false;
  ///是否阅读协议
  bool _agreement = false;
  ///登陆方式
  LoginType _loginType = LoginType.sms;

  final TextEditingController phoneNumController = TextEditingController();
  final TextEditingController checkNumController = TextEditingController();

  bool get canLogin => _canLogin;
  bool get agreement => _agreement;
  LoginType get loginType => _loginType;
  bool get canSendSms => _canSendSms;

  LoginBloc() : super(LoginInitial()) {
    on<RequestLoginEvent>(_requestLoginApi);
    on<ChangeLoginTypeEvent>(_changeLoginType);
    on<PhoneNumChangeEvent>(_changePhoneNumber);
    on<AgreementChangeEvent>(_agreementTypeChange);
    on<CheckFieldChangeEvent>(_checkFiledChange);
    on<RequestSmsCodeEvent>(_requestSmsCodeApi);
  }


  ///请求登陆
  void _requestLoginApi(RequestLoginEvent event, Emitter<LoginState> emitter) async {
    await DioUtil().requestData(
        Api.login,
        method: HttpMethod.post,
        data: {
          'phoneNum':'17730280759',
          'type':_loginType.toString(),
          'password':'asd123456'},
        successCallBack: (data){
          emitter(LoginResultChangeState(true));
        },
        errorCallBack: (error){
          emitter(LoginResultChangeState(false));
        });
  }

  ///请求验证码
  void _requestSmsCodeApi(RequestSmsCodeEvent event, Emitter<LoginState> emitter) async {

  }

  ///切换登陆方式
  void _changeLoginType(ChangeLoginTypeEvent event, Emitter<LoginState> emitter) async {
    if (_loginType == LoginType.sms) {
      _loginType = LoginType.pwd;
    } else {
      _loginType = LoginType.sms;
    }
    checkNumController.clear();
    if (_loginStateChange()) {
      emitter(LoginEventChangeState());
    }
    emitter(LoginTypeChangeState());
  }

  ///手机号输入
  void _changePhoneNumber(PhoneNumChangeEvent event, Emitter<LoginState> 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<LoginState> emitter) async {
    if (_loginStateChange()) {
      emitter(LoginEventChangeState());
    }
  }

  ///是否阅读协议
  void _agreementTypeChange(AgreementChangeEvent event, Emitter<LoginState> 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;
  }
}