Показать диалог с использованием модели Scoped - PullRequest
0 голосов
/ 04 марта 2019

У меня есть базовая форма входа, с моим LoginModel.Но я не понимаю, как я могу вызвать функцию notifyListeners для отображения диалога в моем представлении.

Виджет входа в систему:

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
        body: new ScopedModel<LoginModel>(
            model: _loginModel,
            child: Center(child: ScopedModelDescendant<LoginModel>(
                builder: (context, child, model) {
              if (model.status == Status.LOADING) {
                return Loading();
              }
              else return showForm(context);
            }))));
  }

И модель входа в систему:

class LoginModel extends Model {

  Status _status = Status.READY;
  Status get status => _status;

  void onLogin(String username, String password) async {
    _status = Status.LOADING;
    notifyListeners();

    try {
      await api.login();
      _status = Status.SUCCESS;
      notifyListeners();

    } catch (response) {
      _status = Status.ERROR;
      notifyListeners();
    }
  }

Мне нужно отобразить диалоговое окно, когда status равно Error

1 Ответ

0 голосов
/ 04 марта 2019

Наконец я получил это, просто возвращая Future в методе onLogin

Future<bool> onLogin(String username, String password) async {
    _status = Status.LOADING;
    notifyListeners();

    try {
      await api.login();
      _status = Status.SUCCESS;
      notifyListeners();
      return true;

    } catch (response) {
      _status = Status.ERROR;
      notifyListeners();
      return false;
    }
}

И в виджете:

onPressed: () async {
     bool success = await _loginModel.onLogin(_usernameController.text, _passwordController.text);
     if(success) {
        Navigator.pop(context, true);
      }
      else{
        _showDialogError();
      }
}
...