Flutter,是否可以在没有小部件构建方法的情况下在函数中使用 Firestore Stream Builder?
Flutter, Is it possible to use Firestore Stream Builder in function without a widget build method?
我有一个函数可以获取 google 地点搜索商店和搜索 Firestore 以查看商店是否已在数据库中的结果。
每当我 运行 它认为 Stream Builder 什么都不做。
我认为问题在于该函数不在小部件内并且没有构建方法。这是代码:
void searchStores() async {
Prediction newStore = await PlacesAutocomplete.show(
context: context,
apiKey: kGoogleApiKey,
mode: Mode.overlay,
language: "en",
components: [new Component(Component.country, "au")]);
await places.getDetailsByPlaceId(newStore.placeId).then((detailStoreInfo) {
print('running 1');
StreamBuilder (
stream: Firestore.instance.collection('stores').document(detailStoreInfo.result.id).snapshots(),
builder: (BuildContext context, AsyncSnapshot snapshot){
print('running 2');
setState(() {
if (snapshot.connectionState == ConnectionState.active &&
snapshot.hasData){
print('running 3');
if (snapshot.data['veganOnly'] == null || snapshot.data['veganOnly'] == false){
print('running 4');
setState(() {
firstStore = true;
});
}
}
});
return null;
}
);
});
}
如您所见,我添加了打印语句来找出我的代码哪里出错了。 'running 1' 已显示,因此这些地方正在 return 回应。
但是 none 的其他语句(2,3 或 4)正在打印,所以流生成器似乎没有工作,甚至没有返回空值。
我也试过在流生成器前放一个 return 但这也没有效果。
我的想法是否正确,因为它不在小部件的构建方法中,或者完全是其他东西。
谢谢
A StreamBuilder
是一个 Widget
,因此,必须将其插入到小部件树中的某个位置,就像插入 Text
小部件一样。只需向它传递一个流和 return 里面的另一个小部件 builder
回调
您需要为此使用 Stream class,例如要获取有关名为“users”的集合的所有详细信息,您可以使用,
Stream<QuerySnapshot> stream = _db.collection("users").snapshots();
stream.forEach((QuerySnapshot element) {
if(element == null)
return;
for(int count=0;count<element.documents.length;count++) {
print(element.documents[count].data.toString());
}
});
我有一个函数可以获取 google 地点搜索商店和搜索 Firestore 以查看商店是否已在数据库中的结果。
每当我 运行 它认为 Stream Builder 什么都不做。
我认为问题在于该函数不在小部件内并且没有构建方法。这是代码:
void searchStores() async {
Prediction newStore = await PlacesAutocomplete.show(
context: context,
apiKey: kGoogleApiKey,
mode: Mode.overlay,
language: "en",
components: [new Component(Component.country, "au")]);
await places.getDetailsByPlaceId(newStore.placeId).then((detailStoreInfo) {
print('running 1');
StreamBuilder (
stream: Firestore.instance.collection('stores').document(detailStoreInfo.result.id).snapshots(),
builder: (BuildContext context, AsyncSnapshot snapshot){
print('running 2');
setState(() {
if (snapshot.connectionState == ConnectionState.active &&
snapshot.hasData){
print('running 3');
if (snapshot.data['veganOnly'] == null || snapshot.data['veganOnly'] == false){
print('running 4');
setState(() {
firstStore = true;
});
}
}
});
return null;
}
);
});
}
如您所见,我添加了打印语句来找出我的代码哪里出错了。 'running 1' 已显示,因此这些地方正在 return 回应。
但是 none 的其他语句(2,3 或 4)正在打印,所以流生成器似乎没有工作,甚至没有返回空值。
我也试过在流生成器前放一个 return 但这也没有效果。
我的想法是否正确,因为它不在小部件的构建方法中,或者完全是其他东西。
谢谢
A StreamBuilder
是一个 Widget
,因此,必须将其插入到小部件树中的某个位置,就像插入 Text
小部件一样。只需向它传递一个流和 return 里面的另一个小部件 builder
回调
您需要为此使用 Stream class,例如要获取有关名为“users”的集合的所有详细信息,您可以使用,
Stream<QuerySnapshot> stream = _db.collection("users").snapshots();
stream.forEach((QuerySnapshot element) {
if(element == null)
return;
for(int count=0;count<element.documents.length;count++) {
print(element.documents[count].data.toString());
}
});