Функция сборки Flutter возвращает значение null

#flutter #dart #flutter-web

#flutter #dart #flutter-web

Вопрос:

Я пытаюсь перейти на свою домашнюю страницу или страницу входа в систему на основе authStatus. При использовании Navigator.of(контекст)… она возвращает null для метода сборки в течение секунды, а затем экран обновляется и успешно переходит на заданную страницу. Я относительно новичок в мобильной разработке и flutter. Любые выводы помогут! Спасибо.

Вот код:

   @override
  Widget build(BuildContext context) {
    switch (authStatus) {
      case AuthStatus.NOT_LOGGED_IN:
        WidgetsBinding.instance.addPostFrameCallback((_) {
          {
            Navigator.push(
              context,
              MaterialPageRoute(
                  builder: (context) => LoginSignUpPage(
                        auth: widget.auth,
                        onSignedIn: _onLoggedIn,
                        params: widget.params,
                      )),
            );
          }
        });

        break;
      case AuthStatus.LOGGED_IN:
        if (_userId.length > 0 amp;amp; _userId != null) {
          WidgetsBinding.instance.addPostFrameCallback((_) {
            Navigator.push(
              context,
              MaterialPageRoute(
                  builder: (context) => HomePage(
                        userId: _userId,
                        auth: widget.auth,
                        onSignedOut: _onSignedOut,
                        params: widget.params,
                      )),
            );
          });
        } else
          return widget.waitingScreen;
        break;
      default:
        return widget.waitingScreen;
    }
  

Вот ошибка :

Функция сборки вернула значение null. Нарушающий виджет: функции сборки корневой страницы никогда не должны возвращать значение null. Чтобы вернуть пустое пространство, которое заставляет виджет здания заполнять доступное пространство, верните «Container()». Чтобы вернуть пустое пространство, которое занимает как можно меньше места, верните «Контейнер (ширина: 0.0, высота: 0.0)».

Комментарии:

1. коммутатор фактически ничего не возвращает в первом случае, а во втором, только если вводится else, вы должны выполнить эту операцию где-то еще, а не метод сборки (init или didChangeDependencies)

2. Эй, случай переключения действительно работает! Я установил статус аутентификации в initstate и методе didChangeDependencies, но проблема связана с оператором Navigator.push. Я предполагаю, что перед тем, как он вернет представление, метод сборки выполняется асинхронно и выдает ошибку null, и только когда Navigator.push выполняется, он загружает правильное представление.

3. вы видите ошибку на секунду, потому что вы нажимаете новую страницу перед ней (она выполняется асинхронно, потому что вы добавили WidgetsBinding.instance.addPostFrameCallback), но ваш метод сборки корневой страницы никогда не возвращает виджет

Ответ №1:

в строке кода, следующей за WidgetsBinding, добавьте

 return Container();
  

Вы также можете включить параметр цвета, соответствующий вашему дизайну.