У меня есть список, который содержит несколько документов и снимков. когда я делаю 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]);
}),
);
},
),
);
}
}
),
],
),
),
);
}
}
Я получаю данные Streambuilder, они хорошо отображаются, я могу добавить documentSnapshots в выбранный список и я могу удалить их снова. только когда я проверяю в списке пользователей, если пользователь уже находится в выбранном списке, он всегда будет возвращать значение false, хотя при печати списка и пользователя я вижу, что он там есть.
Решение Очевидно, что прямое сравнение DocumentSnapshots приведет к проблемам, как описано в комментариях к ответу Мореза. Я решил это путем создания пользовательской функции
bool contains(List<DocumentSnapshot> list, DocumentSnapshot item) {
for (DocumentSnapshot i in list) {
if (i.documentID == item.documentID) return true;
}
return false;
}