首页 > 解决方案 > 使用提供程序登录 Firebase google 后如何处理导航?

问题描述

我正在创建一个简单的应用程序,用户可以在其中使用 firebase google_sigin 进行身份验证。我创建了 AuthChecker 小部件,它检查身份验证并返回登录页面,用户可以在其中使用 google 登录。登录完成后,我想返回 AuthChecker 并显示主页。

下面的代码是我的实现,它给出了上下文错误

从 main.dart 文件调用 AuthChecker 小部件:

class AuthChecker extends StatefulWidget {
  @override
  _AuthCheckerState createState() => _AuthCheckerState();
}

class _AuthCheckerState extends State<AuthChecker> {
  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
        future: getCurrentUser(),
        builder: (context, snapshot){
          if(snapshot.connectionState == ConnectionState.done){
            //got response
            FirebaseUser user = snapshot.data;
            LoginStateProvider prov = Provider.of<LoginStateProvider>(context);
            if(user == null){
              //not loggedin pls login
              return LoginPage();
            }else{
              //already logged in
              print("Already logged in");
              prov.updateUserState(user);
              return Home();
            }
          }
        },
      );
  }
}

登录页面包含登录按钮:

Widget signInButton(BuildContext context) {
    return OutlineButton(
      onPressed: () {
        signInWithGoogle().whenComplete(() {
        Navigator.of(context).pushAndRemoveUntil(
          MaterialPageRoute(
            builder: (context)=>AuthChecker();
          ),
          ModalRoute.withName('/auth_check')
        );
      },
}

提供者类如下所示:

class LoginStateProvider with ChangeNotifier{
  String uid;
  String name;
  String email;
  String profilePhoto;

  LoginStateProvider({
    this.uid,
    this.name,
    this.email,
    this.profilePhoto,
  });

  void updateUserState(FirebaseUser user){
    this.uid = user.uid;
    this.name = user.displayName;
    this.email = user.email;
    this.profilePhoto = user.photoUrl;
  }

}

我收到以下错误:

I/flutter ( 9551):   * Ensure the Provider<LoginStateProvider> is an ancestor to this FutureBuilder<FirebaseUser>
I/flutter ( 9551): Widget
I/flutter ( 9551):   * Provide types to Provider<LoginStateProvider>
I/flutter ( 9551):   * Provide types to Consumer<LoginStateProvider>
I/flutter ( 9551):   * Provide types to Provider.of<LoginStateProvider>()
I/flutter ( 9551):   * Always use package imports. Ex: `import 'package:my_app/my_code.dart';
I/flutter ( 9551):   * Ensure the correct `context` is being used.
I/flutter ( 9551):
I/flutter ( 9551): If none of these solutions work, please file a bug at:
I/flutter ( 9551): https://github.com/rrousselGit/provider/issues

标签: flutterdart

解决方案


你可以尝试这样做:

Widget signInButton(BuildContext context) {
    return OutlineButton(
      onPressed: () {
        signInWithGoogle().whenComplete(() {
        FirebaseUser user = snapshot.data;
        if (user == null) {
         //Route to login
        } else {
         //route to somewhere
        }
      },
}

并使用您的徽标和在 initState 处运行的异步函数创建一个启动屏幕,该函数在需要时检查if user == null并路由到登录,如果已经登录,则路由到主页。

这里有一个很好的例子:Firebase Auth state check in Flutter

我不确定它是否有帮助,或者这是否真的是你的问题,如果我误解了你,对不起


推荐阅读