我是新手,这可能是一个简单的问题,但我正在寻找一些解释,以帮助我更多地了解期货和未来建筑商。我正在尝试查询Firebase(取决于用户在上一个屏幕上单击的内容),并且我想等待所有数据加载后再显示任何内容。为此,我认为未来的构建者将是最合适的,因为我将展示一些不会带来很大变化的产品。我创建了我的getData函数:
Future getCardData() async {
return await Firestore.instance.collection('cards')
.where('Event', isEqualTo: widget.documentid).snapshots();
}
}
并在此处实现它:
body: FutureBuilder(
future: getCardData(),
builder: (context, snapshot) {
if (!snapshot.hasData) {
return Center(child: const Text('Loading...'));
}
return GridView.builder(
shrinkWrap: true,
gridDelegate:
SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2),
itemCount: snapshot.data.length,
itemBuilder:
(BuildContext context, int index) {
print(snapshot.data.documents[index].data['img_url']);
return Padding(
padding: const EdgeInsets.all(8.0),
child: Container(
height: MediaQuery.of(context).size.height / 6,
child: Center(
child: Card(
elevation: 8.0,
child: Image(
image: FirebaseImage(snapshot.data.documents[index].data['img_url']),
),
)
),
),
);
},
);
},
),
但是我(由于我假设是GridView.buider的itemCount部分)收到一条错误消息:
type 'Future<int>' is not a subtype of type 'int'
我想知道如何访问此将来值,然后调整代码的其余部分以等待数据加载,然后再显示任何图像。
答案 0 :(得分:1)
snapshots()
返回一个Stream
,因此将其更改为getDocuments()
:
Future<QuerySnapshot> getCardData() async {
return await Firestore.instance.collection('cards')
.where('Event', isEqualTo: widget.documentid).getDocuments();
}
然后在itemCount
中,您可以执行以下操作:
itemCount: snapshot.data.documents.length,