Flutter / Firebase_Auth: функция сборки вернула ноль - PullRequest
1 голос
/ 24 апреля 2020

Когда я пытаюсь запустить приложение, оно выдает ошибку: A build function returned null и вылетает. Вот незаинтересованный виджет. Как это возможно, что он возвращает ноль? и как я могу это исправить?

class Wrapper extends StatefulWidget {
  @override
  _WrapperState createState() => _WrapperState();
}

class _WrapperState extends State<Wrapper> {

  @override
  Widget build(BuildContext context) {
    var auth = FirebaseAuth.instance;
    auth.onAuthStateChanged.listen((user) {
      if (user != null) {
        print("user is logged in");
        return HomeScreen();
        
      } else {
        print("user is not logged in");
        return LoginScreen();
      }
    });

  }
}

Ответы [ 3 ]

2 голосов
/ 24 апреля 2020

Если ваши результаты рендеринга зависят от чего-то, что загружается асинхронно (например, от состояния аутентификации), вы должны сохранить это в состоянии объекта:

class _WrapperState extends State<Wrapper> {

  public _WrapperState() {
    FirebaseAuth.instance.onAuthStateChanged.listen((user) {
      setState(() {
        this.user = user
      });
  }

  @override
  Widget build(BuildContext context) {
    if (user != null) {
      return HomeScreen();        
    } else {
      return LoginScreen();
    }
  }
}

Я обычно предпочитаю писать build как это:

@override
Widget build(BuildContext context) {
  return (user != null) ? HomeScreen() : LoginScreen();
}
1 голос
/ 25 апреля 2020

Поскольку onAuthStateChanged возвращает поток, вы можете использовать построитель потока и создать свой виджет Wrapper StatelessWidget.

class Wrapper extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return StreamBuilder(
      stream: FirebaseAuth.instance.onAuthStateChanged,
      builder: (context, snapshot) {
        if (snapshot.connectionState != ConnectionState.active) {
          return Center(child: CircularProgressIndicator());
        }
        final user = snapshot.data;
        if (user != null) {
          print("user is logged in");
          return HomeScreen();
        } else {
          print("user is not logged in");
          return LoginScreen();
        }
      },
    );
  }
}
0 голосов
/ 25 апреля 2020

Возможно, пользователь изменился, но вы его не видите, потому что:

метод "build" вызывается только при использовании SetState (),

, это означает: "refre sh виджет "


SetState хорошо объяснен здесь: Учебник Flutter для начинающих # 16 - Stateful Widgets

Для FirebaseAuth я нашел этот курс полезным Сборка приложений Flutter & Firebase

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...