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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 02:45:01