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

