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

如何访问Firebase Firestore字段?打车应用登录跳转异常求助

打车应用身份跳转问题排查与解决

如何访问status字段?

我正在开发一款打车应用,希望实现登录后关闭应用,下次打开时直接跳转至对应首页。应用支持司机或乘客两种登录身份,但目前乘客登录后关闭应用,再次打开会跳转至司机首页。我需要访问status字段来区分司机和乘客身份,从而实现条件跳转。以下是我的代码,请帮忙排查解决!

class SplashServices {
   void isLogin(BuildContext context) {
     final auth = FirebaseAuth.instance;
     final user = auth.currentUser;

     if (user != null) {
       Timer(
        const Duration(seconds: 3),
        () => Navigator.push(context,
          MaterialPageRoute(builder: (context) => const DriverPost())));
     } else {
         Timer(
          const Duration(seconds: 3),
          () => Navigator.push(context,
             MaterialPageRoute(builder: (context) => const GettingStarted())));
     }
  }
}

问题根源

当前代码仅判断用户是否登录,完全未读取用于区分身份的status字段,导致所有登录用户都统一跳转到司机首页DriverPost。

解决方案

1. 从Firebase获取用户身份信息

假设你的用户身份数据存储在Firestore的users集合中,每个用户文档以UID为ID,包含status字段(值为driver或passenger)。

2. 修改isLogin方法添加身份判断逻辑

import 'package:cloud_firestore/cloud_firestore.dart';

class SplashServices {
  void isLogin(BuildContext context) {
    final auth = FirebaseAuth.instance;
    final user = auth.currentUser;

    if (user != null) {
      // 查询当前用户的身份信息
      FirebaseFirestore.instance
          .collection('users')
          .doc(user.uid)
          .get()
          .then((doc) {
        if (doc.exists) {
          final String userStatus = doc.data()!['status'];
          // 根据身份跳转对应页面
          Timer(
            const Duration(seconds: 3),
            () => Navigator.push(
              context,
              MaterialPageRoute(
                builder: (context) => 
                  userStatus == 'driver' ? const DriverPost() : const PassengerHome(), // 替换为你的乘客首页组件
              ),
            ),
          );
        } else {
          // 用户数据不存在,跳转登录页
          _navigateToGettingStarted(context);
        }
      }).catchError((_) {
        // 查询失败,跳转登录页
        _navigateToGettingStarted(context);
      });
    } else {
      _navigateToGettingStarted(context);
    }
  }

  // 提取重复跳转逻辑,简化代码
  void _navigateToGettingStarted(BuildContext context) {
    Timer(
      const Duration(seconds: 3),
      () => Navigator.push(
        context,
        MaterialPageRoute(builder: (context) => const GettingStarted()),
      ),
    );
  }
}

3. 注意事项

  • 确保pubspec.yaml中已添加Firestore依赖:cloud_firestore: ^latest_version(替换为当前最新版本)。
  • 如果使用Realtime Database,只需将查询逻辑替换为对应的Realtime Database API即可。
  • 务必在用户登录时将status字段正确写入Firebase数据库。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 03:35:20