flutter - 使用提供程序登录 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
解决方案
你可以尝试这样做:
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
我不确定它是否有帮助,或者这是否真的是你的问题,如果我误解了你,对不起
推荐阅读
- java - 如何使用 apache.commons 中的 CSVParser 以任何顺序读取 CSV 列
- javascript - 如果我只有 ID 作为字符串,如何从数组中删除 objectId?
- python - 如何在 pandas 或 GeoPandas 中过滤具有无效几何形状的 WKT 字符串
- python - 类型错误:不能使用 re.findall() 在类似字节的对象上使用字符串模式
- java - WebViewClient loadData onPageFinished 没有被调用
- c# - 如何使用 PRISM、Mef、DI 将视图模型链接到选项卡控件内的用户控件?
- azure - 如何使用 Azure Python SDK 将 principal_id 转换为用户名
- rest - 我们有任何解决方案可以将 api 响应转换为 ArrayBuffer 吗?
- java - 如何在 Spring Boot 中编写存储库查询以通过关联键进行过滤?
- bash - curl:(52)来自服务器的空回复 - 带有详细场景