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
相关产品推荐
相关产品推荐

