Flutter: StreamProvider <FirebaseUser>с onAuthStateChanged всегда возвращает null в качестве первого значения - PullRequest
1 голос
/ 26 мая 2020

Я пытаюсь создать простую навигацию в соответствии с состоянием аутентификации в Firebase, но по какой-то причине Provider.of<FirebaseUser>(context) всегда возвращает null в качестве первого значения в методе сборки виджета. Таким образом, мое приложение всегда переходит на экран авторизации и после этого получает реальный статус пользователя из Firebase. Что мне здесь не хватает?

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp])
      .then((_) => runApp(App()));
}

class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return StreamProvider<FirebaseUser>.value(
//value of user always corresponds to the right auth status
      value: FirebaseAuth.instance.onAuthStateChanged.map((FirebaseUser user) {
        AuthService.instance.user = user;
        return user;
      }),
      child: MaterialApp(
        title: 'Title',
        theme: lightTheme,
        home: LandingScreen(),
      ),
    );
  }
}

class LandingScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
//Even though the user is logged in it returns null for the first build() call            
    final user = Provider.of<FirebaseUser>(context);

    return AnimatedSwitcher(
      duration: const Duration(milliseconds: 3000),
      transitionBuilder: ...,
      child: user != null ? const MainScreen() : const AuthScreen(),
    );
  }
}

1 Ответ

0 голосов
/ 26 мая 2020
StreamProvider<String>.value(
   initialData: "",
   value: model.secondCountStream,
   child: SecondWidget(),
),

В приведенном выше примере тип потока - String, initialData будет использоваться, пока поток не выдаст значение, а value - это поток, который мы будем слушать. Поэтому, когда вы получаете значение провайдера, в то время оно не имеет никакой ценности. Так что назначьте здесь начальное значение

return StreamProvider<FirebaseUser>.value(
      initialData: data // assign value
      value: FirebaseAuth.instance.onAuthStateChanged.map((FirebaseUser user) {
        AuthService.instance.user = user;
        return user;
      }),
      child: MaterialApp(
        title: 'Title',
        theme: lightTheme,
        home: LandingScreen(),
      ),
    );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...