Flutter读取Firebase实时数据库用户节点报错:bool类无[]实例方法
问题原因分析
- 核心报错逻辑:你调用
snapshot.value["ok"]时,snapshot.value实际是布尔类型的值(对应你数据库里的activity: true),布尔类型没有[]取值方法,因此触发崩溃。 - 层级不匹配问题:
FirebaseAnimatedList的作用是遍历你传入query对应节点下的所有直接子节点,你传入的query是child(currentUser.uid),该节点下的直接子节点是activity(值为布尔)、ok(值为字符串),遍历到activity节点时取值就会报错。 - 为什么移除
child(currentUser.uid)就正常:此时query指向数据库根节点,根节点的直接子节点是各个用户uid对应的节点,每个uid节点的value是包含ok字段的Map,此时调用["ok"]可以正常取值。
解决方案
方案1:仅获取当前用户的ok字段(不需要列表)
如果你的需求只是展示当前用户的ok字段值,不需要遍历子节点做列表,直接替换FirebaseAnimatedList为StreamBuilder监听单个节点即可:
StreamBuilder( stream: FirebaseDatabase.instance.reference().child(currentUser.uid).onValue, builder: (context, AsyncSnapshot<DatabaseEvent> snapshot) { if (!snapshot.hasData) return const CircularProgressIndicator(); Map? userData = snapshot.data?.snapshot.value as Map?; return ListTile( leading: IconButton( onPressed: () {}, icon: const Icon(Icons.ac_unit), ), title: Text(userData?["ok"] ?? "无数据"), ); }, )
方案2:保留FirebaseAnimatedList遍历用户子节点
如果确实需要遍历当前用户节点下的所有子节点,需要增加类型判断和空安全处理,避免取值报错:
itemBuilder: (BuildContext context, DataSnapshot snapshot,Animation<double> animation, int index) { // 先判断value是Map类型再取值 String? okValue; if (snapshot.value is Map) { okValue = (snapshot.value as Map)["ok"]; } return ListTile( leading: IconButton( onPressed: () { }, icon: const Icon(Icons.ac_unit), ), title: Text(okValue ?? "当前节点无ok字段"), ); }
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

