- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
在我的 Flutter 应用程序中,我尝试在使用 whenComplete() 方法完成异步函数后运行一些代码。问题是我的 whenComplete() 方法中的代码甚至在异步函数完成之前就开始执行了。
我也尝试过使用 then() 方法,结果也是一样。
这是我调用异步函数的初始化函数:
@override
void initState() {
super.initState();
FirebaseAuth.instance.currentUser().then((user) {
setState(() {
mUid = user.uid;
getUserName();
getUserHomes().whenComplete(() {
print(mUserHomes);
setState(() {
dropdownVal = mUserHomes[0];
});
});
});
}).catchError((e) {
print(e);
});
}
这是异步函数的函数体:
Future getUserHomes() async {
CollectionReference ref = Firestore.instance
.collection('users')
.document(mUid)
.collection('accessibleHomes');
QuerySnapshot eventsQuery = await ref.getDocuments();
eventsQuery.documents.forEach((document) {
DocumentReference homeReference = document["homeReference"];
getHomeDevices("home", homeReference).whenComplete(() {
setState(() {});
});
homeReference.get().then((DocumentSnapshot ds) {
mUserHomes.add(ds["alias"].toString());
});
});
}
运行应用程序的控制台输出是:
Performing hot restart...
Syncing files to device ASUS Z01RD...
Restarted application in 2,521ms.
I/flutter ( 5718): []
E/flutter ( 5718): [ERROR:flutter/lib/ui/ui_dart_state.cc(148)] Unhandled Exception: RangeError (index): Invalid value: Valid value range is empty: 0
E/flutter ( 5718): #0 List.[] (dart:core-patch/growable_array.dart:145:60)
E/flutter ( 5718): #1 _TabOneState.initState.<anonymous closure>.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:smart_switch/home/tabs/tab_one/tab_one_content.dart:52:37)
E/flutter ( 5718): #2 State.setState (package:flutter/src/widgets/framework.dart:1117:30)
E/flutter ( 5718): #3 _TabOneState.initState.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:smart_switch/home/tabs/tab_one/tab_one_content.dart:51:11)
E/flutter ( 5718): #4 _rootRun (dart:async/zone.dart:1120:38)
E/flutter ( 5718): #5 _CustomZone.run (dart:async/zone.dart:1021:19)
E/flutter ( 5718): #6 _FutureListener.handleWhenComplete (dart:async/future_impl.dart:150:18)
E/flutter ( 5718): #7 Future._propagateToListeners.handleWhenCompleteCallback (dart:async/future_impl.dart:609:39)
E/flutter ( 5718): #8 Future._propagateToListeners (dart:async/future_impl.dart:665:37)
E/flutter ( 5718): #9 Future._complete (dart:async/future_impl.dart:473:7)
E/flutter ( 5718): #10 _SyncCompleter.complete (dart:async/future_impl.dart:51:12)
E/flutter ( 5718): #11 _AsyncAwaitCompleter.complete (dart:async-patch/async_patch.dart:28:18)
E/flutter ( 5718): #12 _completeOnAsyncReturn (dart:async-patch/async_patch.dart:294:13)
E/flutter ( 5718): #13 _TabOneState.getUserHomes (package:smart_switch/home/tabs/tab_one/tab_one_content.dart)
E/flutter ( 5718): #14 _asyncThenWrapperHelper.<anonymous closure> (dart:async-patch/async_patch.dart:77:64)
E/flutter ( 5718): #15 _rootRunUnary (dart:async/zone.dart:1132:38)
E/flutter ( 5718): #16 _CustomZone.runUnary (dart:async/zone.dart:1029:19)
E/flutter ( 5718): #17 _FutureListener.handleValue (dart:async/future_impl.dart:126:18)
E/flutter ( 5718): #18 Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:639:45)
E/flutter ( 5718): #19 Future._propagateToListeners (dart:async/future_impl.dart:668:32)
E/flutter ( 5718): #20 Future._complete (dart:async/future_impl.dart:473:7)
E/flutter ( 5718): #21 _SyncCompleter.complete (dart:async/future_impl.dart:51:12)
E/flutter ( 5718): #22 _AsyncAwaitCompleter.complete (dart:async-patch/async_patch.dart:28:18)
E/flutter ( 5718): #23 _completeOnAsyncReturn (dart:async-patch/async_patch.dart:294:13)
E/flutter ( 5718): #24 Query.getDocuments (package:cloud_firestore/src/query.dart)
E/flutter ( 5718): #25 _asyncThenWrapperHelper.<anonymous closure> (dart:async-patch/async_patch.dart:77:64)
E/flutter ( 5718): #26 _rootRunUnary (dart:async/zone.dart:1132:38)
E/flutter ( 5718): #27 _CustomZone.runUnary (dart:async/zone.dart:1029:19)
E/flutter ( 5718): #28 _FutureListener.handleValue (dart:async/future_impl.dart:126:18)
E/flutter ( 5718): #29 Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:639:45)
E/flutter ( 5718): #30 Future._propagateToListeners (dart:async/future_impl.dart:668:32)
E/flutter ( 5718): #31 Future._complete (dart:async/future_impl.dart:473:7)
E/flutter ( 5718): #32 _SyncCompleter.complete (dart:async/future_impl.dart:51:12)
E/flutter ( 5718): #33 _AsyncAwaitCompleter.complete (dart:async-patch/async_patch.dart:28:18)
E/flutter ( 5718): #34 _completeOnAsyncReturn (dart:async-patch/async_patch.dart:294:13)
E/flutter ( 5718): #35 MethodChannel.invokeMapMethod (package:flutter/src/services/platform_channel.dart)
E/flutter ( 5718): #36 _asyncThenWrapperHelper.<anonymous closure> (dart:async-patch/async_patch.dart:77:64)
E/flutter ( 5718): #37 _rootRunUnary (dart:async/zone.dart:1132:38)
E/flutter ( 5718): #38 _CustomZone.runUnary (dart:async/zone.dart:1029:19)
E/flutter ( 5718): #39 _FutureListener.handleValue (dart:async/future_impl.dart:126:18)
E/flutter ( 5718): #40 Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:639:45)
E/flutter ( 5718): #41 Future._propagateToListeners (dart:async/future_impl.dart:668:32)
E/flutter ( 5718): #42 Future._complete (dart:async/future_impl.dart:473:7)
E/flutter ( 5718): #43 _SyncCompleter.complete (dart:async/future_impl.dart:51:12)
E/flutter ( 5718): #44 _AsyncAwaitCompleter.complete (dart:async-patch/async_patch.dart:28:18)
E/flutter ( 5718): #45 _completeOnAsyncReturn (dart:async-patch/async_patch.dart:294:13)
E/flutter ( 5718): #46 MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart)
E/flutter ( 5718): #47 _asyncThenWrapperHelper.<anonymous closure> (dart:async-patch/async_patch.dart:77:64)
E/flutter ( 5718): #48 _rootRunUnary (dart:async/zone.dart:1132:38)
E/flutter ( 5718): #49 _CustomZone.runUnary (dart:async/zone.dart:1029:19)
E/flutter ( 5718): #50 _FutureListener.handleValue (dart:async/future_impl.dart:126
因此,在调用异步函数 getUserHomes 的 init() 函数中,我尝试将 dropdownVal 变量设置为从 Firestore DB 获取的列表 mUserHomes 的第一个值。该列表在控制台中打印为 [],这意味着空,但如果我在稍后阶段打印该列表,它会打印出值。
最佳答案
你的 getUserHomes
函数在它不等待的 forEach
回调中做了一堆异步工作,所以 getUserHomes
完成了它返回的Future
几乎在 ref.getDocuments
完成后立即执行。
如果你想等待 getUserHomes
中的所有工作完成,你可以这样做:
Future<void> getUserHomes() async {
CollectionReference ref = Firestore.instance
.collection('users')
.document(mUid)
.collection('accessibleHomes');
QuerySnapshot eventsQuery = await ref.getDocuments();
final waitList = <Future<void>>[];
for (var document in eventsQuery.documents) {
DocumentReference homeReference = document["homeReference"];
waitList.add(getHomeDevices("home", homeReference));
waitList.add(
homeReference.get().then((DocumentSnapshot ds) {
mUserHomes.add(ds["alias"].toString());
});
);
}
await Future.wait(waitList);
}
关于firebase - whenComplete() 方法未按预期工作 - Flutter Async,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56600754/
我对java有点陌生,所以如果我犯了一个简单的错误,请原谅我,但我不确定我哪里出错了,我收到的错误是“预期的.class,预期的标识符,而不是声明, ';'预期的。”我尝试了不同的方法,并从这些方法中
This question already has answers here: chai test array equality doesn't work as expected (3个答案) 3年前
我正在学习 Java(对不起,我的英语很差,这不是我的母语),当我在 Eclipse (JavaSE-1.7) 中在我输入的每个“try”中执行“try-finally” block 时,会出现以下消
我收到两个错误,指出 token 上的语法错误,ConstructorHeaderName expected instead & token “(”上的语法错误,< expected 在线: mTM.
我找不到错误。 Eclipse 给我这个错误。每个 { } 都是匹配的。请帮忙。 Multiple markers at this line - Syntax error on token “)”,
代码: import java.awt.*; import javax.swing.*; import java.awt.event.*; public class DoubleIt extends
我正在用 python(Vs 代码)编写代码,但出现此错误: Expected ")" Pylance 错误发生在:def main() 我试着运行我的 main 并将它打印到我的屏幕上。我用谷歌搜
我正在尝试按照 documentation 中的建议使用异步函数。但我收到此错误 意外的 token ,预期 ( async function getMoviesFromApi() { try
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-topic
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-topic
第一行包含一个表示数组长度的整数p。第二行包含用空格分隔的整数,这些整数描述数组中的每个元素。第三行打印一个整数,指示负数组的数量。 package asgn3; import java.util.*
好的,我是初学者,我必须修复此 java 表达式语言代码才能在我的系统 (Windchill) 中工作,但看起来我在语法中遗漏了一些内容: LWCNormalizedObject lwc =
我无法编译我的程序! 我想我缺少一个花括号,但我怎么也看不出在哪里! import javax.swing.*; import java.awt.*;
我的 jQuery 代码有问题,我的 Firebug 向我发出警告:需要选择器。 这是代码: $("img[id$='_tick']").each(function() { $(this).c
我的新类(class) Fountainofyouth 遇到了问题。尝试构建整个项目后,调试器显示 warning: extended initializer lists only available
我已经从 Java 转向 CPP,并且正在努力围绕构造构造函数链进行思考,我认为这是我的问题的根源。 我的头文件如下: public: GuidedTour(); GuidedTour(string
鉴于以下 for(var i=0; i< data.cats.length; i++) list += buildCategories(data.cats[i]); jsLint 告诉我 Expect
我有这个 json,但 Visual Studio Code 在标题中给了我警告。 [ { "title": "Book A", "imageUrl": "https:
我正在尝试编写一个有条件地禁用四个特殊成员函数(复制构造、移动构造、复制赋值和移动赋值)的包装类,下面是我用于测试目的的快速草稿: enum class special_member : uint8_
所以我用 F# 编写了一个非常简单的程序,它应该对 1000 以下的所有 3 和 5 的倍数求和: [1..999] |> List.filter (fun x -> x % 3 = 0 || x %
我是一名优秀的程序员,十分优秀!