【发布时间】:2021-07-30 19:05:08
【问题描述】:
我正在使用 Stream 检索用户列表,我需要忽略当前用户。我用 Future List 做过一次,但是用 StreamBuilder 定义文档列表时会出现错误。
以下是可行的方法(未来):
Future<List<Users>> _getUsers() async {
Firestore db = Firestore.instance;
QuerySnapshot querySnapshot = await db
.collection('users')
.getDocuments();
List<Users> usersList = [];
for (DocumentSnapshot item in querySnapshot.documents) {
var data = item.data;
if (data["id"] == _userId) continue;
Users user = Users();
user.name = data["name"];
user.username = data["username"];
user.id = data["id"];
usersList.add(user);
}
return usersList;
}
这不起作用(流):
startConnecting() {
return Expanded(
child: StreamBuilder(
stream:Firestore.instance.collection('users').snapshots(),
builder: (context, snapshot) {
if (!snapshot.hasData) {
return Center(
child: Text(
"Nothing."
),
),
);
}
return ListView.builder(
padding: EdgeInsets.only(top: 10),
scrollDirection: Axis.vertical,
itemCount: snapshot.data.documents.length,
itemBuilder: (context, index) =>
_buildListUsers(context, snapshot.data.documents[index]),
);
},
),
);
}
Widget _buildListUsers(BuildContext context, DocumentSnapshot document) {
List<Users> usersList = [];
for (DocumentSnapshot item in document) {
在最后一个 'document' 中出现一条错误消息:“'for' 循环中使用的类型 'DocumentSnapshot' 必须实现 Iterable。”
var data = item.data;
if (data["id"] == _userId) continue;
Users user = Users();
user.name = document["name"];
user.username = document["username"];
user.id = document["id"];
usersList.add(user);
return ListTile(
...
);
}
}
我查找了这个错误,但没有找到类似的东西。这一定是我缺少的一些简单的东西。
【问题讨论】:
-
不要这样做:
stream:Firestore.instance.collection('users').snapshots()。仔细阅读有关 StreamBuilder 的文档的第二和第三段。他们解释了为什么你正在做的事情被破坏了。