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

Flutter中Firebase手机号认证后意外跳转主界面问题求助

问题分析

你的核心问题是:Firebase Auth在手机号验证通过后就自动创建了用户账号,导致initialLoginState检测到用户存在,触发了跳转到MainNavigationScreen的逻辑,但此时用户还未完成姓名、性别等后续注册信息的填写。本质是当前登录状态判断只依赖了Firebase用户是否存在,没有区分用户是否完成完整注册流程。

解决方案

我们需要给用户增加「注册完成状态标记」,结合Firebase用户存在性和该标记来控制页面跳转,同时调整注册流程的导航逻辑。

1. 新增用户注册完成状态标记

使用Firebase Firestore(或Auth自定义Claims)给用户添加isProfileCompleted字段,默认值为false,用户完成所有注册步骤后改为true。

示例代码:监听Auth状态+注册完成状态

替换原来的initialLoginState初始化逻辑,改为实时监听Auth状态并结合Firestore的注册完成标记:

final initialLoginState = ValueNotifier<bool>(false);

@override
void initState() {
  super.initState();
  // 监听Firebase Auth状态变化
  FirebaseAuth.instance.authStateChanges().listen((user) async {
    if (user == null) {
      initialLoginState.value = false;
    } else {
      // 从Firestore获取用户注册完成状态
      final userDoc = await FirebaseFirestore.instance
          .collection('users')
          .doc(user.uid)
          .get();
      // 默认未完成注册
      final isProfileCompleted = userDoc.data()?['isProfileCompleted'] ?? false;
      initialLoginState.value = isProfileCompleted;
    }
  });
}

2. 修改首页跳转逻辑

在首页判断时,不仅要检查用户是否存在,还要处理「已登录但未完成注册」的情况:

home: MediaQuery(
  data: MediaQuery.of(context).copyWith(textScaler: const TextScaler.linear(1.0)),
  child: ValueListenableBuilder<bool>(
    valueListenable: initialLoginState,
    builder: (context, isLoggedIn, child) {
      if (isLoggedIn) {
        return const MainNavigationScreen(tab: "일기");
      } else {
        // 如果已有用户但未完成注册,直接跳转到信息填写页
        final currentUser = FirebaseAuth.instance.currentUser;
        if (currentUser != null) {
          return const ProfileSetupScreen();
        }
        return const SignUpScreen();
      }
    },
  ),
),

3. 调整注册流程导航

手机号验证通过后,不要依赖initialLoginState自动跳转,而是手动导航到信息填写页面:

void _verifyPhoneFireAuth() async {
  final FirebaseAuth firebaseAuth = FirebaseAuth.instance;
  final authPhoneNumber = "+82 10${_selectedPhone.toString().substring(4)}";
  await firebaseAuth.verifyPhoneNumber(
    phoneNumber: authPhoneNumber,
    timeout: const Duration(seconds: 60),
    verificationCompleted: (phoneAuthCredential) async {
      await firebaseAuth.signInWithCredential(phoneAuthCredential).then((value) {
        _timer.cancel();
        // 手动跳转到个人信息填写页面
        Navigator.push(
          context,
          MaterialPageRoute(builder: (_) => const ProfileSetupScreen()),
        );
      }).catchError((e) {
        _timer.cancel();
        setState(() {
          _requestPhoneAuthSms = false;
        });
      });
    },
    // 其他回调逻辑保持不变
    verificationFailed: (error) {
      if (error.code == "invalid-phone-number") {
        showErrorSnackBar(context, "잘못된 휴대폰 번호입니다.");
      }
    },
    codeSent: (verificationId, forceResendingToken) {
      setState(() {
        _verificationId = verificationId;
      });
    },
    codeAutoRetrievalTimeout: (verificationId) {},
  );
}

4. 完成信息后更新注册状态

在ProfileSetupScreen中,用户提交信息后更新Firestore的注册状态,并跳转主页面:

void _submitProfile() async {
  final currentUser = FirebaseAuth.instance.currentUser;
  if (currentUser == null) return;

  // 保存用户信息到Firestore
  await FirebaseFirestore.instance
      .collection('users')
      .doc(currentUser.uid)
      .set({
    'name': _nameController.text,
    'gender': _selectedGender,
    'region': _selectedRegion,
    'isProfileCompleted': true, // 标记注册完成
  });

  // 跳转到主页面
  Navigator.pushReplacement(
    context,
    MaterialPageRoute(builder: (_) => const MainNavigationScreen(tab: "일기")),
  );
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 21:17:12