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

Flutter中如何读取Firebase实时数据库数据并添加if else条件判断?

Flutter + Firebase实时数据库实现生命值功能

1. 配置依赖与初始化

首先在pubspec.yaml中添加必要依赖:

dependencies:
  flutter:
    sdk: flutter
  firebase_core: ^2.15.0
  firebase_database: ^10.2.0

在main.dart中完成Firebase核心初始化:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(const MyApp());
}

2. 读取用户生命值

编写异步方法获取当前用户的生命值,默认给初始值(比如3点):

import 'package:firebase_database/firebase_database.dart';

Future<int> getUserLifePoints(String userId) async {
  final userRef = FirebaseDatabase.instance.ref('users/$userId/lifePoints');
  final event = await userRef.once();
  // 数据库无数据时返回默认生命值
  return event.snapshot.value as int? ?? 3;
}

3. 取消预约时的判断与扣减逻辑

使用Firebase事务保证扣减操作的原子性,避免并发修改出错:

Future<void> processCancelAppointment(String userId) async {
  final lifePointsRef = FirebaseDatabase.instance.ref('users/$userId/lifePoints');
  
  // 获取当前生命值
  final currentPoints = await getUserLifePoints(userId);
  
  // 条件判断:生命值>0才能执行取消
  if (currentPoints <= 0) {
    // 执行限制逻辑:比如弹窗提示用户无法取消
    print('生命值不足,无法取消预约');
    return;
  }
  
  // 执行生命值扣减事务
  await lifePointsRef.runTransaction((mutableData) async {
    final current = mutableData.value as int? ?? 0;
    mutableData.value = current - 1;
    return Transaction.success(mutableData);
  });
  
  // 扣减成功后执行取消预约的业务逻辑
  print('扣除1点生命值,预约已取消');
  // 此处添加你的核心业务代码:更新预约状态、通知司机等
}

4. 初始化新用户生命值

新用户注册时主动设置初始生命值,避免读取默认值的不确定性:

Future<void> initUserLifePoints(String userId) async {
  final userRef = FirebaseDatabase.instance.ref('users/$userId/lifePoints');
  final event = await userRef.once();
  // 用户节点无生命值数据时设置初始值
  if (event.snapshot.value == null) {
    await userRef.set(3);
  }
}

5. 实时监听生命值变化(可选)

如果需要在UI上实时同步生命值,添加监听:

void listenLifePointsUpdates(String userId) {
  final userRef = FirebaseDatabase.instance.ref('users/$userId/lifePoints');
  userRef.onValue.listen((event) {
    final lifePoints = event.snapshot.value as int? ?? 3;
    // 刷新UI显示,比如调用setState更新页面
    print('当前生命值:$lifePoints');
  });
}

6. 数据库权限配置

在Firebase控制台的实时数据库规则中,设置仅用户自己可读写其生命值:

{
  "rules": {
    "users": {
      "$userId": {
        ".read": "auth.uid === $userId",
        ".write": "auth.uid === $userId"
      }
    }
  }
}

扩展条件判断示例

根据不同生命值设置多层限制:

Future<void> checkUserPermissions(String userId) async {
  final lifePoints = await getUserLifePoints(userId);
  
  if (lifePoints == 0) {
    print('生命值为0,无法取消或发起新预约');
  } else if (lifePoints <= 2) {
    print('剩余生命值不足,再取消${2 - lifePoints}次将无法预约');
  } else {
    print('生命值充足,可正常取消预约');
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 13:50:21