Dart开发:如何根据Firebase数据动态切换Icon?已尝试但失效
问题解决:根据Firebase返回值动态切换Icon
你的问题根源在于两点:
- 预先定义的
_activeStream已经过滤了Active等于Yes的用户数据,所以StreamBuilder只会拿到符合该条件的结果,自然一直显示Icons.check。 sourceBuilder本身已经提供了当前行的row数据,完全不需要额外监听整个集合的流,直接用当前行的状态值判断即可。
修正方案1:直接利用当前行数据(推荐)
如果表格数据已经是从Firebase加载完成的,直接通过row参数获取Active字段值来切换图标:
DatatableHeader( text: "Active", value: "useractive", show: true, sortable: true, sourceBuilder: (value, row) { // 从当前行数据中取Active状态,默认值设为'No'避免空值报错 final String activeStatus = row['Active'] ?? 'No'; return Icon( activeStatus == 'Yes' ? Icons.check : Icons.close, // 可选:给不同状态的图标加颜色区分 color: activeStatus == 'Yes' ? Colors.green : Colors.red, ); }, )
修正方案2:监听单个文档实时更新
如果需要图标随Firestore中数据的变化实时切换,可以针对当前行的用户ID监听单个文档的流:
DatatableHeader( text: "Active", value: "useractive", show: true, sortable: true, sourceBuilder: (value, row) { // 获取当前行用户的文档ID final String userId = row.id; return StreamBuilder<DocumentSnapshot>( stream: FirebaseFirestore.instance.collection('users').doc(userId).snapshots(), builder: (context, snapshot) { if (!snapshot.hasData) { return Icon(Icons.error_outline); } final docData = snapshot.data!.data() as Map<String, dynamic>; final String activeStatus = docData['Active'] ?? 'No'; return Icon( activeStatus == 'Yes' ? Icons.check : Icons.close, color: activeStatus == 'Yes' ? Colors.green : Colors.red, ); }, ); }, )
注意事项
- 确保
row中包含Active字段,或者文档ID能正确关联到Firestore中的用户文档。 - Firestore的字段名区分大小写,要保证代码中的
'Active'和集合里的字段名完全一致。
内容的提问来源于stack exchange,提问作者TB AS
相关产品推荐
相关产品推荐

