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

更新Firebase后钱包余额无法显示及交易更新问题求助

问题修复方案

1. 修复空安全与运算符优先级问题

你的Text组件中,字符串拼接和空合并运算符的优先级错误,导致空值处理失效,同时需要更严谨的空安全判断:

原代码存在的问题:

"KES" + snapshot.data!["Wallet"].toString() ?? 0.toString()

由于+优先级高于??,如果Wallet字段为null,最终会得到"KESnull"而非预期的"KES0"。

修复后的文本处理逻辑:

"KES${snapshot.data?.get("Wallet") ?? 0}"

使用get()方法读取字段更规范,结合空合并运算符直接处理null场景,同时用字符串插值简化写法。

2. 替换FutureBuilder为StreamBuilder实现实时更新

FutureBuilder仅会在首次获取数据后执行一次,交易完成后无法自动监听Firestore文档的变化。改用StreamBuilder监听文档快照的实时更新,余额变更后UI会自动刷新:

完整修复代码:

Container(
  child: StreamBuilder<DocumentSnapshot>(
    stream: FirebaseFirestore.instance
        .collection("users")
        .doc(RitechApp.sharedPreferences.getString(RitechApp.userUID))
        .snapshots(),
    builder: (c, snapshot) {
      if (snapshot.connectionState == ConnectionState.waiting) {
        return Center(
          child: CircularProgressIndicator(
            valueColor: AlwaysStoppedAnimation<Color>(kPrimaryColor),
          ),
        );
      }
      
      // 检查文档是否存在
      if (!snapshot.hasData || !snapshot.data!.exists) {
        return Text(
          "KES0",
          style: TextStyle(
              fontSize: 25,
              fontFamily: "Muli",
              color: Colors.white),
        );
      }

      final walletBalance = snapshot.data!.get("Wallet") ?? 0;
      return Text(
        "KES$walletBalance",
        style: TextStyle(
            fontSize: 25,
            fontFamily: "Muli",
            color: Colors.white),
      );
    },
  ),
),

3. 额外排查点

  • 确认RitechApp.sharedPreferences.getString(RitechApp.userUID)能正确获取用户UID,避免因文档路径错误导致无法读取数据。
  • 检查Firestore中users集合对应文档的Wallet字段是否存在,且类型为数字(int/double),避免类型转换异常。
  • 交易更新余额的代码中,确保使用update()或set()正确修改Wallet字段,可添加错误捕获逻辑验证操作是否成功。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 13:12:15