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

Flutter中如何判断新老用户并控制页面跳转?

解决方案:根据用户是否完善信息跳转页面

核心思路

不要通过“判断UID是否为最新添加”来区分新老用户(多用户同时注册时逻辑会失效),正确逻辑是检查Firestore的riders或vendors集合中是否存在当前用户UID对应的文档:

  • 文档不存在 → 新用户,跳转信息填写页
  • 文档存在 → 已完善信息,跳转目标页面

实现代码与步骤

1. 封装Firestore检查函数

先写异步函数判断用户是否已完善信息:

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';

Future<bool> hasUserCompletedProfile() async {
  final currentUser = FirebaseAuth.instance.currentUser;
  if (currentUser == null) return false;

  // 检查骑手集合
  final riderDoc = await FirebaseFirestore.instance.collection('riders').doc(currentUser.uid).get();
  if (riderDoc.exists) return true;

  // 检查商家集合
  final vendorDoc = await FirebaseFirestore.instance.collection('vendors').doc(currentUser.uid).get();
  return vendorDoc.exists;
}

2. 监听Auth状态处理跳转

用StreamBuilder监听登录状态,结合FutureBuilder判断用户是否需要完善信息:

import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_ui_auth/firebase_ui_auth.dart';

class AuthRouteHandler extends StatelessWidget {
  const AuthRouteHandler({super.key});

  @override
  Widget build(BuildContext context) {
    return StreamBuilder<User?>(
      stream: FirebaseAuth.instance.authStateChanges(),
      builder: (context, authSnapshot) {
        // 用户未登录,显示FlutterFire UI登录/注册页
        if (!authSnapshot.hasData) {
          return const SignInScreen(
            providerConfigs: [
              EmailProviderConfiguration(),
              // 可添加其他登录方式,比如GoogleProviderConfiguration()
            ],
          );
        }

        // 用户已登录,检查是否完善信息
        return FutureBuilder<bool>(
          future: hasUserCompletedProfile(),
          builder: (context, profileSnapshot) {
            if (profileSnapshot.connectionState == ConnectionState.waiting) {
              return const Center(child: CircularProgressIndicator());
            }

            final hasCompletedProfile = profileSnapshot.data ?? false;
            return hasCompletedProfile 
                ? const MainScreen() // 已完善信息跳主页
                : const ProfileSetupScreen(); // 未完善跳信息填写页
          },
        );
      },
    );
  }
}

3. 信息填写页提交逻辑

用户填写信息后,将数据写入对应集合并跳转:

// 信息填写页的提交示例函数
Future<void> submitProfile(Map<String, dynamic> profileData, bool isRider) async {
  final currentUser = FirebaseAuth.instance.currentUser;
  if (currentUser == null) return;

  // 根据用户身份选择集合写入
  final collection = isRider ? 'riders' : 'vendors';
  await FirebaseFirestore.instance
      .collection(collection)
      .doc(currentUser.uid)
      .set(profileData);

  // 提交成功后跳转主页
  Navigator.of(context).pushReplacement(MaterialPageRoute(builder: (_) => const MainScreen()));
}

关键配置

确保Firestore规则允许已登录用户读写自己的文档:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /riders/{userId} {
      allow read, write: if request.auth != null && request.auth.uid == userId;
    }
    match /vendors/{userId} {
      allow read, write: if request.auth != null && request.auth.uid == userId;
    }
  }
}

内容的提问来源于stack exchange,提问作者Muhammad Zunair Shahzad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 22:45:38