firebase - Flutter如何以另一种方法从Firestore传入documents.length?
问题描述
我有一个采用值的方法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
);
}
),
],
);
}
}
基本上,我尝试创建一个返回 aFuture<int>
并尝试传递它的方法,但这不起作用,因为 aFuture<int>
与int
. 我明白,但解决方案对我来说并不清楚。
解决方案
我不确定 brites 和书签之间的关系——也就是说,你希望更频繁地改变它。我将假设一旦用户打开书签部分,书签就不会改变。
如果是这种情况,您可以在 initState 中检索书签长度值。您将覆盖状态类的 initState() 方法,然后调用从数据库中检索值的异步方法。(初始化状态本身不能是异步的)。检索到值后,您可以调用 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;
}
一个更强大的解决方案可能是有一个单独的类来处理侦听流和检索数组的长度,然后将您要显示的所有信息组合成一些抽象数据类型,然后将其放入单独的您指定的专门供 UI 收听的流。
推荐阅读
- python-3.x - Python 的 Selenium 选择问题 - 选择源 srcset
- java - 杰克逊异常处理 - 如何获取所有未映射的字段
- youtube-data-api - 来自 YouTube API 的电子邮件地址?
- r - R 小于在不应该返回 true 时
- amazon-web-services - elasticbeanstalk 描述应用程序版本返回空
- apollo - Apollo Client GraphQL 在 Next.js getStaticProps 上创建静态页面
- javascript - 如何将 js 表数据转换为 .csv 表?
- python - Python 3.6、3.7、3.8 上的 Python ImportError,但 3.9 上没有
- python - KeyError:“[Float64Index([xxxxxx,yyyy,zzzz....]) 都不在 [index] 中
- flutter - 如何禁用颤振开关