login_bloc.dart 3.7 KB
import 'dart:async';

import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter_bloc/flutter_bloc.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 _sendSmsIng = false;
  ///是否阅读协议
  bool _agreement = false;
  ///登陆方式
  LoginType _loginType = LoginType.sms;

  int _countDown = 0;

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

  bool get canLogin => _canLogin;
  bool get agreement => _agreement;
  LoginType get loginType => _loginType;
  bool get canSendSms => _canSendSms;
  int get countDown => _countDown;
  bool get sendSmsIng => _sendSmsIng;

  LoginBloc() : super(LoginInitial()) {
    on<RequestLoginEvent>(_requestLoginApi);
    on<ChangeLoginTypeEvent>(_changeLoginType);
    on<PhoneNumChangeEvent>(_changePhoneNumber);
    on<AgreementChangeEvent>(_agreementTypeChange);
    on<ForgetPasswordEvent>(_forgetPassword);
    on<CheckFieldChangeEvent>(_checkFiledChange);
    on<CountDownEvent>(_countDownChange);
    on<CancelCountDownEvent>(_cancelTimer);
  }


  ///请求登陆
  void _requestLoginApi(RequestLoginEvent 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());
    }
  }

  ///忘记密码
  void _forgetPassword(ForgetPasswordEvent event, Emitter<LoginState> emitter) async {

  }

  ///倒计时
  void _countDownChange(CountDownEvent event, Emitter<LoginState> emitter) {
    _sendSmsIng = !_sendSmsIng;
    emitter(CountDownNumChangeState());
  }

  void _cancelTimer(CancelCountDownEvent event,Emitter<LoginState> emitter) {

  }

  ///登陆状态判断
  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;
  }
}