You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter集成Firebase谷歌登录异常:用户未同步且未自动导航

解决Flutter Firebase谷歌登录的两个问题:用户数据不显示&登录后不跳转

我仔细看了你的代码,发现两个问题的根源都在几个关键逻辑的缺失和小的拼写/语法错误上,咱们一步步来修复:

问题1:Firebase控制台看不到用户数据

原因分析

  1. 创建用户的函数未被调用:你写了createUserInFireStore函数,但登录成功后没有触发这个函数,导致Firestore里根本没有写入用户数据
  2. 拼写错误:函数里的userRef应该是你之前定义的usersRef;另外userNAme拼写错误,应该是userName

修复代码

首先在登录成功后调用createUserInFireStore,同时修正拼写错误:

void handleSignIn(GoogleSignInAccount account) {
  if (account != null) {
    setState(() {
      isAuth = true;
    });
    // 新增:登录成功后触发创建用户逻辑
    createUserInFireStore();
  } else {
    setState(() {
      isAuth = false;
    });
  }
}

Future<void> createUserInFireStore() async {
  final GoogleSignInAccount user = googleSignIn.currentUser;
  DocumentSnapshot doc = await usersRef.document(user.id).get();
  if (!doc.exists) {
    String userName;
    userName = await Navigator.of(context)
        .push(MaterialPageRoute(builder: (context) => CreateAccount()));
    // 修正:userRef -> usersRef;userNAme -> userName
    usersRef.document(user.id).setData({
      "id": user.id,
      "userName": userName,
      "photoUrl": user.photoUrl,
      "email": user.email,
      "displayName": user.displayName,
      "bio": "",
      "timeStamp": timestamp
    });
  }
}

问题2:登录成功后未自动跳转到CreateAccount页面

原因分析

  1. 缺少跳转触发逻辑:之前的handleSignIn只更新了isAuth状态,没有调用createUserInFireStore(上面已经修复了这一点)
  2. 提交按钮语法错误:在CreateAccount页面中,onTap: submit()会导致页面加载时立即执行submit函数,而不是点击按钮时执行,应该去掉括号

修复代码

修正CreateAccount页面的提交按钮:

GestureDetector(
  // 修正:submit() -> submit
  onTap: submit,
  child: Container(
    decoration: BoxDecoration(
        color: Colors.blue,
        borderRadius: BorderRadius.circular(7.0)
    ),
    child: Center(
      child: Text("Submit", style: TextStyle(
        color: Colors.white,
        fontSize: 15.0,
      )),
    ),
  ),
)

额外小优化建议

  • 给dispose方法加上@override注解,符合Flutter的生命周期规范:
@override
void dispose() {
  pageController.dispose();
  super.dispose();
}
  • 给CreateAccount的表单加验证逻辑,确保用户名符合要求:
TextFormField(
  onSaved: (val)=> userName = val,
  validator: (val) {
    if (val == null || val.length < 8) {
      return "用户名至少需要8个字符";
    }
    return null;
  },
  decoration: InputDecoration(
      border: OutlineInputBorder(),
      labelText: "username",
      labelStyle: TextStyle(fontSize: 15.0),
      hintText: "must have 8 char"),
),

同时在submit函数里先验证表单:

submit() {
  if (_formKey.currentState.validate()) {
    _formKey.currentState.save();
    Navigator.pop(context, userName);
  }
}

这样修改后,登录成功后会自动跳转到CreateAccount页面,提交用户名后用户数据会写入Firestore,你就能在Firebase控制台看到用户信息了。

内容的提问来源于stack exchange,提问作者rahul shah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 15:37:36