在我的Flutter应用程序中,我尝试使用whenComplete()方法在异步函数完成后运行一些代码。问题是我的whenComplete()方法中的代码甚至在异步函数完成之前就已执行。
我也尝试过使用then()方法,这也产生了相同的结果。
这是我要在其中调用该异步函数的init函数:
@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的第一个值。列表在控制台中显示为[],表示为空,但是如果我在以后的阶段中打印列表,则会使用值进行打印。
答案 0 :(得分:3)
您的getUserHomes
函数在foreach
回调中执行了许多异步工作,它不等待,因此getUserHomes
几乎在{之后立即完成了返回的Future
{1}}完成。
如果您要等待ref.getDocuments
中的所有工作完成,可以执行以下操作:
getUserHomes
答案 1 :(得分:0)
我遇到了同样的问题,并且意识到,如果您使用for循环,那么可以使用预期的方法来代替