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

