【发布时间】:2020-03-24 17:42:40
【问题描述】:
我有一个包含多个文档快照的列表。当我执行 list.contains(documentsnapshot) 时,它总是返回 false。示例:
DocumentSnapshot a = document;
List<DocumentSnapshot> snapshots = []
snapshots.add(a);
snapshots.contains(a) // false
实际代码的精简版
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
class AddUsersDialog extends StatefulWidget {
@override
_AddUsersDialogState createState() => _AddUsersDialogState();
}
class _AddUsersDialogState extends State<AddUsersDialog> {
List<DocumentSnapshot> selected = [];
@override
Widget build(BuildContext context) {
return Scaffold(
resizeToAvoidBottomInset: false,
body: Container(
child: Column(
children: <Widget>[
// row to display the selected users
Row(
children: List.generate(selected.length,
(index) => InkWell(
onTap: () => setState(() => selected.removeAt(index)),
child: Text(selected[index]['name']),
);
),
),
// list of all users
StreamBuilder<QuerySnapshot>(
stream: getUsers(),
builder: (BuildContext context,
AsyncSnapshot<QuerySnapshot> snapshot) {
if (snapshot.hasData) {
List<DocumentSnapshot> users = snapshot.data.documents;
return Flexible(
child: ListView.builder(
itemCount: users.length,
itemBuilder: (BuildContext context, int index) {
return ListTile(
leading: Text(users[index]['name']),
onTap: () => setState(() {
if (selected.contains(users[index])) return;
selected.add(users[index]);
}),
);
},
),
);
}
}
),
],
),
),
);
}
}
我得到了流生成器数据,它显示得很好,我可以将 documentSnapshots 添加到所选列表中,并且可以再次删除它们。只有当我签入用户列表时,如果用户已经在选定的列表中,它总是会返回 false,即使当我打印列表和用户时,我可以看到它在那里。
解决方案 显然,直接比较 DocumentSnapshots 会给出 Morez 回答中描述的问题。我通过创建自定义包含函数来解决它
bool contains(List<DocumentSnapshot> list, DocumentSnapshot item) {
for (DocumentSnapshot i in list) {
if (i.documentID == item.documentID) return true;
}
return false;
}
【问题讨论】:
标签: firebase flutter arraylist dart google-cloud-firestore