![](/img/trans.png)
[英]cant retreive the documents in my firebase using documents.length
[英]Flutter How to pass in documents.length from Firestore in another method?
我有一个采用int
值的方法,该值应该是Cloud Firestore集合中文档中array
字段长度的值。
我对 Flutter 尤其是 Firestore 都很陌生,我认为这与期货、查询和流的工作方式有关,但我似乎无法正确理解它。
这就是我想要实现的目标:
class UserBookmarksSection extends StatefulWidget {
@override
_UserBookmarksSectionState createState() => _UserBookmarksSectionState();
}
class _UserBookmarksSectionState extends State<UserBookmarksSection> {
@override
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
HeadlineItem(title: "Your bookmarks"),
StreamBuilder(
stream: Firestore.instance.collection("brites").snapshots(),
builder: (context, snapshot) {
if (!snapshot.hasData) return const Text("Loading...");
return Column(
children: populateBriteList(snapshot, x, true), //Here I want to pass in the length of the array in firestore into x
);
}
),
],
);
}
}
基本上,我尝试创建一个返回Future<int>
的方法并尝试传递它,但这不起作用,因为Future<int>
与int
类型不同。 我明白,但解决方案对我来说并不清楚。
我不确定 brites 和书签之间的关系——也就是说,你希望更频繁地改变它。 我将假设一旦用户打开书签部分,书签就不会改变。
如果是这种情况,您可以在 initState 中检索书签长度值。 您将覆盖 state 类的 initState() 方法,然后调用从数据库中检索值的异步方法。 (init state 本身不能是异步的)。 检索到值后,您可以调用 setState() 以使用设置为 int 的书签值更新小部件。
可能看起来像这样:
class UserBookmarksSection extends StatefulWidget {
@override
_UserBookmarksSectionState createState() => _UserBookmarksSectionState();
}
class _UserBookmarksSectionState extends State<UserBookmarksSection> {
int bookmarksLength;
@override
void initState(){
super.initState();
getBookmarksLength();
}
Future<void> getBookmarksLength() async {
bookmarksLength = await getArrayLength(id);
setState((){});
}
@override
Widget build(BuildContext context) {
if(bookmarksLength == null) return CircularProgressIndicator();
else return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
HeadlineItem(title: "Your bookmarks"),
StreamBuilder(
stream: Firestore.instance.collection("brites").snapshots(),
builder: (context, snapshot) {
if (!snapshot.hasData) return const Text("Loading...");
return Column(
children: populateBriteList(snapshot, bookmarksLength, true),
);
}
),
],
);
}
}
Firestore firestore = Firestore.instance;
Future<int> getArrayLength(String documentId) async {
DocumentSnapshot snapshot = await firestore.collection('collection').document(documentId).get();
return snapshot.data['array'].length;
}
一个更强大的解决方案可能是拥有一个单独的 class 来处理监听 stream 和检索数组的长度,然后将您要显示的所有信息组合成一些抽象数据类型,您将其放入单独的您指定的 stream 是专门供 UI 监听的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.