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

Flutter Google登录导航异常:新老用户跳转逻辑不符预期

Flutter Google登录导航逻辑错误与重复登录问题修复

问题根源

  • 登录页导航逻辑漏洞:无论Firestore中用户文档是否存在,代码最终都会执行跳转SignUpGoogle的逻辑,直接覆盖了老用户跳转到主页的分支。
  • 注册页重复登录冗余:用户已通过Google登录进入补充信息页面,却再次执行完整的Google登录流程,完全没必要。

修复方案

1. 修复登录页的导航逻辑

修改signingoogle函数,确保老用户直接进入主页,新用户才跳转补充信息页,同时避免后续代码干扰:

Future<User?> signingoogle() async {
  try {
    final GoogleSignInAccount? googleaccount = await GoogleSignIn().signIn();
    
    if (googleaccount == null) {
      return null;
    }
    print('Creating Google Auth');
    final GoogleSignInAuthentication googleAuth =
        await googleaccount.authentication;
    final AuthCredential credential = GoogleAuthProvider.credential(
      accessToken: googleAuth.accessToken,
      idToken: googleAuth.idToken,
    );

    final UserCredential userCredential =
        await FirebaseAuth.instance.signInWithCredential(credential);
         
    final User? user = userCredential.user;
   
    if (user != null) {
      final CollectionReference users =
          FirebaseFirestore.instance.collection('users');
      final DocumentSnapshot emailDocument = await users.doc(user.uid).get();
      if (emailDocument.exists) {
        // 老用户直接跳主页,用pushReplacement避免返回登录页
        Navigator.pushReplacement(
            context, MaterialPageRoute(builder: (context) => btmNavBar()));
        // 提前返回,阻止后续代码执行
        return user;
      } else {
        await users.doc(user.uid).set({'email': user.email});
        final AuthCredential emailAuthCredential =
            EmailAuthProvider.credential(
                email: user.email.toString(), password: 'google password');
        await userCredential.user!.linkWithCredential(emailAuthCredential);
        // 新用户跳补充信息页
        Navigator.pushReplacement(
            context, MaterialPageRoute(builder: (context) => SignUpGoogle()));
      }
    }
    return user;
  } catch (e) {
    print('$e');
  }
  return null;
}

核心修改:

  • 老用户分支添加return user,直接终止函数,避免后续跳转代码执行
  • 改用pushReplacement跳转,优化用户返回逻辑
  • 将新用户的跳转逻辑严格限制在else分支内

2. 移除注册页的重复Google登录逻辑

直接使用当前已登录用户的信息保存补充数据,无需重复登录:

SecondayBtn(
  onPressed: () async {
    var userContact = contactController.text.trim();
    var storeName = storeNameController.text.trim();
    var userAddress = addressController.text.trim();
    if (formKey.currentState!.validate()) {
      try {
        // 直接获取当前已登录用户
        User? currentUser = FirebaseAuth.instance.currentUser;
        if (currentUser != null) {
          // 保存补充数据到Firestore
          await saveUserData(
            currentUser.uid, 
            currentUser.email!, 
            userContact, 
            storeName, 
            userAddress
          );
          // 跳主页并销毁当前页面
          Navigator.pushReplacement(
            context,
            MaterialPageRoute(builder: (context) => btmNavBar()),
          );
        }
      } catch (e) {
        print('Error saving data: $e');
      }
    }
  },
  btntxt: 'Complete Sign Up', // 按钮文本适配当前操作
),

核心修改:

  • 删除所有Google登录相关代码,直接调用FirebaseAuth.instance.currentUser获取用户信息
  • 调整按钮文本为更贴合操作的表述
  • 保留异常捕获,方便排查数据保存问题

内容的提问来源于stack exchange,提问作者Syed Mujtaba Ali kazmi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 15:16:28