Firebase 如何使代码停止执行下一行,直到函数在flutter中完成其工作?
我有一个云存储,通过从我的应用程序上传数据来存储数据。我还有一个云firestore数据库,在那里我存储上传文件的文件名和URL。我面临的问题是,我的代码试图在上传数据/文件之前收集url,因此崩溃。所以我希望我的代码停在那里,完成任务并转到下一行。我甚至在代码中使用了async/await,但它仍然没有帮助 这是我的密码:-Firebase 如何使代码停止执行下一行,直到函数在flutter中完成其工作?,firebase,flutter,dart,google-cloud-firestore,firebase-storage,Firebase,Flutter,Dart,Google Cloud Firestore,Firebase Storage,我有一个云存储,通过从我的应用程序上传数据来存储数据。我还有一个云firestore数据库,在那里我存储上传文件的文件名和URL。我面临的问题是,我的代码试图在上传数据/文件之前收集url,因此崩溃。所以我希望我的代码停在那里,完成任务并转到下一行。我甚至在代码中使用了async/await,但它仍然没有帮助 这是我的密码:- Future savingfile(List<int> asset, String name) async { StorageReference r
Future savingfile(List<int> asset, String name) async {
StorageReference reference = FirebaseStorage.instance.ref().child(name);
StorageUploadTask uploadTask = reference.putData(asset);
String url = await (await uploadTask.onComplete).ref.getDownloadURL();
//print(url);
//documentFileUpload(url);
return url;
}
getfilelink(String s) async {
StorageReference ref = FirebaseStorage.instance.ref().child('$s');
String url = (await ref.getDownloadURL()).toString();
return url;
}
saveeverything(List filechosen) async {
for (int i = 0; i < filechosen.length; i++) {
await savingfile(filechosen[i].readAsBytesSync(), filenames[i]);
}
}
void updatedata() async {
..... //some more codes are here.
await saveeverything(filechosen); //i want my code to wait and finish the task over here and go to next line.
String fileurl = "", filedetails = "";
if (filenames.length == 0) {
filedetails = "none";
fileurl = "none";
} else {
for (int i = 0; i < filenames.length; i++) {
filedetails += filenames[i].toString() + " ";
}
for (int i = 0; i < filenames.length; i++) {
String t = getfilelink(filenames[i]) + " ";
fileurl += t;
}
}
await notices.add({
"event": notice,
"date": date,
"description": detail,
"index": ds.docs.length + 1,
"files": filedetails,
"url": fileurl
});
}
Future savingfile(列表资产、字符串名称)异步{
StorageReference=FirebaseStorage.instance.ref().child(名称);
StorageUploadTask uploadTask=reference.putData(资产);
字符串url=await(await uploadTask.onComplete);
//打印(url);
//文件上传(url);
返回url;
}
getfilelink(字符串s)异步{
StorageReference ref=FirebaseStorage.instance.ref().child(“$s”);
字符串url=(wait ref.getDownloadURL()).toString();
返回url;
}
保存所有内容(列表文件选择)异步{
for(int i=0;i
这是我的密码,希望你能理解
这是我得到的错误
E/flutter ( 4499): [ERROR:flutter/lib/ui/ui_dart_state.cc(166)] Unhandled Exception: NoSuchMethodError: Class 'Future<dynamic>' has no instance method '+'.
E/flutter ( 4499): Receiver: Instance of 'Future<dynamic>'
E/flutter ( 4499): Tried calling: +(" ")
E/flatter(4499):[错误:flatter/lib/ui/ui\u dart\u state.cc(166)]未处理的异常:NoSuchMethodError:类“Future”没有实例方法“+”。
E/颤振(4499):接收器:“未来”实例
E/flatter(4499):尝试调用:+(“”)
谢谢大家! 您的updatedata函数必须是Future类型(不确定这是否有效,或者是否必须是Future才能返回某些结果) 在你的有状态/无状态课程中,你最终会等待未来的到来,比如
小部件构建(构建上下文){
returnfuturebuilder(
未来:你的未来,
生成器:(上下文,快照){
我没有理解你的意思我没有任何分析选项.yaml文件..我找不到你的错误是因为:getfilelink(filenames[i])+“
getfilelink
是异步的,因此它返回一个未来的必须等待才能对其使用+
。(另外,你应该为你的函数声明返回类型。)我的代码不会在开始时运行,而是在点击按钮后运行,因此我没有任何小部件,也没有任何要构建的东西,没有future builder可以吗?你可以将FutureBuilder放在输出小部件前面,如builder:(上下文,快照){Text(myFutureText);}在加载完成之前,您可能希望在此位置显示一些旋转的轮子。如果这有帮助,接受或向上投票,答案会很好:-)