Используя пакет провайдера, как управлять одним bool для вызова метода tow на той же странице - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть экран входа в систему, где есть 2 кнопки.

  • Вход
  • Вход FB

Я использую пакет поставщика для управления состоянием приложения. Ниже приведен логин blo c.

class LoginBloc with ChangeNotifier {
  bool _isAPICalling = false;

  bool get isAPICalling => _isAPICalling;

  apiCallingStatus(bool isCall) {
    _isAPICalling = isCall;
    notifyListeners();
  }



  Future<LoginResponseModel> callLoginApi(LoginReqModel _loginReqModel) =>
      locator<LoginService>().login(_loginReqModel);

  Future<LoginResponseModel> callFBLoginApi(SocialUser _loginReqModel) =>
      locator<LoginService>().fbLogin(_loginReqModel);

}

Я использую isAPICalling для управления загрузчиком на экране входа в систему.

Ниже приведен код двух кнопок простого входа в систему и fb login.

Widget _loginBtn(LoginBloc _bloc) {
    return RoundButtonWidget(
      label: Translations.of(context).text('login'),
      isAPICalling: _bloc.isAPICalling,
      buttonTap: () {
        Utils.hideKeyboard(context);
        _globalFormKey.currentState.save();

        if (_checkValidation()) {          
          _bloc.apiCallingStatus(true);
          _bloc.callLoginApi(_loginReqModel).then((result) async {
            _bloc.apiCallingStatus(false);
            if (result.success == 1) {
              Navigator.pushReplacement(
                  context, MaterialPageRoute(builder: (context) => HomePage()));
            } else {
              Utils.openAlertDialog(result.message, context);
            }
          });
        }
      },
    );
  }

   Widget _facebookBtn(LoginBloc _bloc) {
        return RoundButtonWidget(
          label: Translations.of(context).text('login'),
          isAPICalling: _bloc.isAPICalling,
          buttonTap: () {
            Utils.hideKeyboard(context);
            _globalFormKey.currentState.save();

            if (_checkValidation()) {          
              _bloc.apiCallingStatus(true);
              _bloc.callFBLoginApi(_loginReqModel).then((result) async {
                _bloc.apiCallingStatus(false);
                if (result.success == 1) {
                  Navigator.pushReplacement(
                      context, MaterialPageRoute(builder: (context) => HomePage()));
                } else {
                  Utils.openAlertDialog(result.message, context);
                }
              });
            }
          },
        );
      }

Здесь проблема заключается в том, что, когда я нажимаю на любую из кнопок, отображается обе кнопки загрузчика. Как я могу управлять состоянием, чтобы загрузчик отображался только для нажимаемой кнопки?

1 Ответ

1 голос
/ 11 апреля 2020

Мы не можем достичь этого с помощью одного bool. Вы можете управлять им, используя String, где для каждой кнопки вы можете установить "FB" / "simple_login" , посмотрите ниже

Вот пример со строкой _bloc.isAPICalling == 'FB'

Widget _facebookBtn(LoginBloc _bloc) {
        return RoundButtonWidget(
          label: Translations.of(context).text('login'),
          isAPICalling: _bloc.isAPICalling == 'FB',
          buttonTap: () {
            Utils.hideKeyboard(context);
            _globalFormKey.currentState.save();

            if (_checkValidation()) {          
              _bloc.apiCallingStatus(true);
              _bloc.callFBLoginApi(_loginReqModel).then((result) async {
                _bloc.apiCallingStatus(false);
                if (result.success == 1) {
                  Navigator.pushReplacement(
                      context, MaterialPageRoute(builder: (context) => HomePage()));
                } else {
                  Utils.openAlertDialog(result.message, context);
                }
              });
            }
          },
        );
      }
...