Как обрабатывать навигацию в режиме blo c после нажатия кнопки - PullRequest
0 голосов
/ 11 февраля 2020

Я добавляю пользователя в базу данных firestore, используя шаблон блока. При нажатии кнопки я вызвал мой блок вставки логина пользователя c, а после обратного вызова в streamBuilder я хочу переместить пользователя на втором экране.

Проблемы, с которыми я сталкиваюсь с этим кодом

  1. Мой метод навигации вызывает вызывающий дважды построитель
  2. setState () или markNeedsBuild (), вызываемый во время сборки.
  3. Проблема переполнения RenderFlex внизу

Проверка записи кода нажатия кнопки и вызов метода blo c, т.е. _loginBlo c .addUser (_users);

Widget _commonWidget() {
return Container(
  width: MediaQuery.of(context).size.width / 1.5,
  margin: EdgeInsets.only(bottom: 70),
  child: RaisedButton(
    padding: EdgeInsets.all(10),
    child: Text(
      'Next',
      style: TextStyle(color: Colors.white, fontSize: 18),
    ),
    onPressed: () {
      // check is first name is valid
      bool isValidFirstName = validateName(_firstNameController);
      debugPrint(" isValidFirstName $isValidFirstName");
      if (isValidFirstName) {
        setState(() {
          _isValidFirstNameError = false;
        });

        //check if last name is valid
        bool isValidLastName = validateName(_lastNameController);
        debugPrint(" isValidLastName $isValidLastName");
        if (isValidLastName) {
          setState(() {
            _isValidLastNameError = false;
          });
          FocusScope.of(context).requestFocus(new FocusNode());

          _users.firstName = _firstNameController.value.text;
          _users.lastName = _lastNameController.value.text;
          _users.fullName = _firstNameController.value.text +
              " " +
              _lastNameController.value.text;

          _loginBloc.addUser(_users);
        } else {
          //last name is not valid display error message
          setState(() {
            _isValidLastNameError = true;
          });
        }
      } else {
        //first name is not valid display error message
        setState(() {
          _isValidFirstNameError = true;
        });
      }
    },
    color: Colors.teal[300],
    shape: RoundedRectangleBorder(
      borderRadius: BorderRadius.circular(10),
    ),
  ),
);

}

Проверка кода StreamBuilder, если данные успешно вставлен, а затем перейдите на secondScreen

StreamBuilder<Response>(
                    stream: _loginBloc.response,
                    builder: (context, snapshot) {
                      if (snapshot.hasData) {
                        debugPrint(
                            "snapshot.connectionState = ${snapshot.connectionState}");
                        if (snapshot.data.isSuccess &&
                            snapshot.data.documentID != null) {
                          _users.documentID = snapshot.data.documentID;
                          print("pregnancyDetails Navigation");

                          SchedulerBinding.instance
                              .addPostFrameCallback((_) {
                            Navigator.pushReplacementNamed(
                                context, '/secondScreen',
                                arguments: _users);
                          });

                        } else {
                          final snackBar = SnackBar(
                              content: Text(
                                  "Something has gone wrong, please try later: "));
                          Scaffold.of(context).showSnackBar(snackBar);
                        }
                       // return _commonWidget();
                        return _commonWidget();
                      } else {
                        return _commonWidget();
                      }
                    })
...