Flutter接入Firebase Realtime Database时if外声明变量未保留赋值
问题根源
- 核心是异步执行顺序问题:
databaseReference.get().then(...)的回调逻辑是异步执行的,主线程不会等待回调内的赋值操作完成,就会提前执行后续的print(token)代码,此时token还未被赋值,因此输出为null。 - 存在冗余数据库请求:你已经通过
await databaseReference.once()拿到了数据快照,后续再调用databaseReference.get()属于重复请求,完全可以省略。
修复代码
将.then()回调替换为await调用,保证赋值操作完成后再执行后续逻辑,适配空安全的优化代码如下:
sendNotification( BuildContext context, String title, String message, String userID) async { DatabaseReference databaseReference = tokensRef.child(userID); // 直接用await等待get返回结果,避免回调嵌套 DataSnapshot snapshot = await databaseReference.get(); String? token; // 用exists判断数据是否存在,比直接判空更严谨 if (snapshot.exists) { Map<dynamic, dynamic>? values = snapshot.value as Map?; token = values?['deviceToken']; } print(token); // 后续需要使用token的逻辑请放在此处 }
修改说明
- 移除冗余的
once()调用和.then()异步回调,用await同步写法保证执行顺序,确保token被赋值后再执行后续打印、使用逻辑 - 用
snapshot.exists判断数据有效性,适配Firebase Dart SDK最新的空安全规范 - 声明token为可空类型
String?,符合Dart空安全要求,避免编译错误
内容的提问来源于stack exchange,提问作者ckingprogramming
相关产品推荐
相关产品推荐

