Flutter 如何在颤振中实现异步/等待
我有这个函数,它执行一些Flutter 如何在颤振中实现异步/等待,flutter,Flutter,我有这个函数,它执行一些firestore操作并检索数据 但问题是它返回一个空值。我找到的原因是,它在获取数据之前返回值,它不会等到检索到数据时才返回值 这是我的密码。我已经打印了一些print语句来检查执行顺序 getNewsOnSearchBar() { final String _collection = 'news'; final Firestore _fireStore = Firestore.instance; var newsList = []; print("
firestore
操作并检索数据
但问题是它返回一个空值。我找到的原因是,它在获取数据之前返回值,它不会等到检索到数据时才返回值
这是我的密码。我已经打印了一些print
语句来检查执行顺序
getNewsOnSearchBar() {
final String _collection = 'news';
final Firestore _fireStore = Firestore.instance;
var newsList = [];
print("1");
getData() async {
print("2");
return await _fireStore.collection(_collection).getDocuments();
}
getData().then((val) async{
if (val.documents.length > 0) {
print("3");
for (int i = 0; i < val.documents.length; i++) {
newsList.add(await val.documents[i].data["headline"]);
}
} else {
print("Not Found");
}
});
print("4");
return ok;
}
我需要的输出是:
I/flutter (17145): 1
I/flutter (17145): 2
I/flutter (17145): 3
I/flutter (17145): 4
有人能帮我吗?如果您想像您的情况一样等待来自
未来的值,请不要使用,然后使用等待:
Future<int> myFunc() {
return Future.delayed(Duration(seconds: 1), () => 0);
}
void main() async {
final int result = await myFunc();
print(result);//0
}
Future myFunc(){
返回Future.delayed(持续时间(秒数:1),()=>0);
}
void main()异步{
最终int结果=等待myFunc();
打印(结果);//0
}
在您的情况下,您希望执行类似的操作(您可以根据需要进行更改):
getNewsOnSearchBar()异步{
最后一个字符串_collection='news';
最终Firestore _Firestore=Firestore.instance;
var newsList=[];
印刷品(“1”);
getData()异步{
印刷品(“2”);
return wait_fireStore.collection(_collection.getDocuments();
}
final ref=等待获取数据();
如果(参考文件长度>0){
印刷品(“3”);
对于(int i=0;i
当您想像您的情况一样等待来自未来的值时,不要使用然后
,使用等待
:
Future<int> myFunc() {
return Future.delayed(Duration(seconds: 1), () => 0);
}
void main() async {
final int result = await myFunc();
print(result);//0
}
Future myFunc(){
返回Future.delayed(持续时间(秒数:1),()=>0);
}
void main()异步{
最终int结果=等待myFunc();
打印(结果);//0
}
在您的情况下,您希望执行类似的操作(您可以根据需要进行更改):
getNewsOnSearchBar()异步{
最后一个字符串_collection='news';
最终Firestore _Firestore=Firestore.instance;
var newsList=[];
印刷品(“1”);
getData()异步{
印刷品(“2”);
return wait_fireStore.collection(_collection.getDocuments();
}
final ref=等待获取数据();
如果(参考文件长度>0){
印刷品(“3”);
对于(int i=0;i
您可以使用wait来代替使用,这将解决您的问题。
下面是代码在更改后的外观,我强烈建议您指定函数将返回的数据类型
getNewsOnSearchBar() async {
final String _collection = 'news';
final Firestore _fireStore = Firestore.instance;
var newsList = [];
print("1");
Future<QuerySnapshot> getData() async {
print("2");
return await _fireStore.collection(_collection).getDocuments();
}
QuerySnapshot val = await getData();
if (val.documents.length > 0) {
print("3");
for (int i = 0; i < val.documents.length; i++) {
newsList.add(val.documents[i].data["headline"]);
}
} else {
print("Not Found");
}
print("4");
return ok;
}
getNewsOnSearchBar()异步{
最后一个字符串_collection='news';
最终Firestore _Firestore=Firestore.instance;
var newsList=[];
印刷品(“1”);
Future getData()异步{
印刷品(“2”);
return wait_fireStore.collection(_collection.getDocuments();
}
QuerySnapshot val=等待获取数据();
如果(val.documents.length>0){
印刷品(“3”);
对于(int i=0;i
您可以使用wait来代替使用,这将解决您的问题。
下面是代码在更改后的外观,我强烈建议您指定函数将返回的数据类型
getNewsOnSearchBar() async {
final String _collection = 'news';
final Firestore _fireStore = Firestore.instance;
var newsList = [];
print("1");
Future<QuerySnapshot> getData() async {
print("2");
return await _fireStore.collection(_collection).getDocuments();
}
QuerySnapshot val = await getData();
if (val.documents.length > 0) {
print("3");
for (int i = 0; i < val.documents.length; i++) {
newsList.add(val.documents[i].data["headline"]);
}
} else {
print("Not Found");
}
print("4");
return ok;
}
getNewsOnSearchBar()异步{
最后一个字符串_collection='news';
最终Firestore _Firestore=Firestore.instance;
var newsList=[];
印刷品(“1”);
Future getData()异步{
印刷品(“2”);
return wait_fireStore.collection(_collection.getDocuments();
}
QuerySnapshot val=等待获取数据();
如果(val.documents.length>0){
印刷品(“3”);
对于(int i=0;i
您的for循环给出了问题,您在async中使用了for循环,然后在for循环中使用了wait。您的for循环给出了问题,您在async中使用了for循环,然后在for循环中使用了wait。我得到这个错误:Future'不是“List”类型的子类型。
好的,它可以工作,但是如何返回newsList
,并将其放入变量var list=[]
。当我尝试此操作时,会出现错误,类型“Future”不是类型“List”的子类型。
您能否再次共享您当前使用的代码?我检查了我在firebase集合中注释的代码,它似乎工作正常。这就是我正在使用的代码<代码>最终字符串_collection='news';最终Firestore _Firestore=Firestore.instance;var newsList=[];印刷品(“1”);Future getData()异步{print(“2”);返回wait _fireStore.collection(_collection).getDocuments();}QuerySnapshot val=wait getData();如果(val.documents.length>0){print(“3”);对于(int i=0;i
您必须使用wait或然后执行与var list=wait getNewsOnSearchBar()相同的操作,我得到以下错误:Future'不是'list'类型的子类型
好的,它可以工作,但我如何返回newsList
并将其获取到变量var list=[]
。当我尝试此操作时,会出现错误,类型“Future”不是类型“List”的子类型。
您能否再次共享您当前使用的代码?我检查了我在firebase集合中注释的代码,它似乎工作正常。这就是我正在使用的代码<代码>最终字符串_collection='news';最终Firestore _Firestore=Firestore.instance;var newsList=[];印刷品(“1”);Future getData()异步{print(“2”);