Flutter(Dart)中GridView与Firebase列表对比异常求助
解决GridView中多数据对比显示“Added”标记的问题
我瞅了下你的代码,问题出在coursedata的处理上——你现在把它当成单个对象来用,但实际上你从Firebase获取的是多条数据,每次循环都覆盖了coursedata的值,最后它只保留了最后一条文档的courseid,自然只有匹配最后一个ID的课程会显示“Added”。
下面是具体的修复步骤:
1. 调整变量类型,存储所有已添加的课程ID
把原来的coursedata改成一个列表,用来存所有从Firebase拿到的课程ID:
// 替换原来的coursedata变量 List<dynamic> addedCourseIds = [];
2. 修改getcourseData方法,收集所有课程ID
更新Firebase数据获取逻辑,把每个文档里的courseid都添加到列表中,并且调用setState刷新UI:
getcourseData() async { databaseReference.collection(user.email).getDocuments().then((querySnapshot) { // 先清空列表,避免重复数据 addedCourseIds.clear(); querySnapshot.documents.forEach((result) { // 将每个文档的courseid加入列表 addedCourseIds.add(result.data['courseid']); }); // 刷新UI,让GridView重新渲染 setState(() {}); }); }
3. 修正GridView中的判断逻辑
把原来单个ID对比的逻辑,改成检查当前课程ID是否在已添加列表中:
// 替换原来的Text组件 Text(addedCourseIds.contains(course[index]['id']) ? "Added" : "")
额外提示
记得在页面初始化的时候调用getcourseData,比如在initState里:
@override void initState() { super.initState(); getcourseData(); }
这样修改后,所有已添加的课程都会正确显示“Added”标记了。核心就是把单个对象改成列表存储所有匹配的ID,再用contains方法做存在性判断~
内容的提问来源于stack exchange,提问作者Gnziet
相关产品推荐
相关产品推荐

