首页 > 解决方案 > 无法通过 StreamProvider 获取 Firebase 用户

问题描述

我在我的第一个小部件中注册了 firebase 用户,并在登录第二个屏幕后尝试访问它。我得到的结果是空的,我得到了这个错误:Could not find the correct provider above this widget.经过研究,我仍然找不到原因。我猜上下文可能在某个地方,但仍然无法弄清楚为什么。

这是我的第一个小部件:

    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
            title: 'Chat App',
            debugShowCheckedModeBanner: false,
            theme: ThemeData(
                primarySwatch: Colors.blueGrey,
                visualDensity: VisualDensity.adaptivePlatformDensity,
                inputDecorationTheme: InputDecorationTheme(
                    border: OutlineInputBorder(
                  borderRadius: BorderRadius.circular(20),
                )),
                buttonTheme: ButtonThemeData(buttonColor: Colors.blueGrey)),
            home: MultiProvider(providers: [
              StreamProvider<FirebaseUser>.value(
                value: FirebaseAuth.instance.onAuthStateChanged,
              )
            ], child: SignInPage()));
      }
    }

这是我的第二个屏幕的片段:

     RaisedButton(
                    shape: RoundedRectangleBorder(
                        borderRadius: BorderRadius.circular(40)),
                    child: ListTile(
                      leading: Container(
                        color: Colors.white,
                        child: Image.network(
                          'https://cdn4.iconfinder.com/data/icons/new-google-logo-2015/400/new-google-favicon-512.png',
                          width: 25,
                          height: 25,
                        ),
                      ),
                      title: Text(
                        'Sign In with Google',
                        style: TextStyle(
                            color: Colors.white, fontWeight: FontWeight.bold),
                      ),
                    ),
                    onPressed: () async {
                      setState(() {
                        _progressBarActive = true;
                      });
                      FirebaseUser user =
                          Provider.of<FirebaseUser>(context, listen: false);
                      await signInWithGoogle().then((value) {
                        print(value.uid);
    //                    print(user.uid);
                        Navigator.pushReplacement(context,
                            MaterialPageRoute(builder: (context) => ChatRoom()));
                      }).whenComplete(() => {
                            setState(() {
                              _progressBarActive = false;
                            })
                          });
                    },
                  ),

标签: firebaseflutterflutter-provider

解决方案


MultiProvider与交换MaterialApp

return MultiProvider(
      providers: [
        StreamProvider<FirebaseUser>.value(
          value: FirebaseAuth.instance.onAuthStateChanged,
        )
      ],
      child: MaterialApp(
        home: SignInPage(),
      ),
    );

推荐阅读