在我的颤栗项目中:
Future<Position> getCurrentPosition({
LocationAccuracy desiredAccuracy = LocationAccuracy.best,
GeolocationPermission locationPermissionLevel =
GeolocationPermission.location,
}) async {在我的班上:
import 'package:geolocator/geolocator.dart';
import 'package:logger/logger.dart';
class TestAsync {
var _logger = Logger();
Future<void> main() async {
_logger.d("TestAsync: main: Fetching user order...");
_logger.d(await createOrderMessage());
}
Future<String> createOrderMessage() async {
_logger.d("TestAsync: createOrderMessage: BEFORE_WAIT ");
var order = await fetchUserOrder();
return 'TestAsync: createOrderMessage: AFTER_WAIT Your order is: $order';
}
Future<Position> fetchUserOrder() async {
_logger.d("TestAsync: fetchUserOrder: ");
for (int index = 0; index < 10; index++) {
Geolocator()
.getCurrentPosition(desiredAccuracy: LocationAccuracy.high)
.then((value) {
_logger.d("TestAsync: fetchUserOrder: index = $index then_value = $value");
});
}
}
}如您所见,我使用异步函数fetchUserOrder。为了调用这个函数,我使用
await fetchUserOrder();因此,结果必须是:
执行fetchUserOrder的
完成后的
fetchUserOrder只打印:is...:TestAsync: createOrderMessage: AFTER_WAIT order AFTER_WAIT
但结果是另一种
I/flutter (11975): │ createState:
I/flutter (11975): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
I/flutter (11975): ┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
I/flutter (11975): │ #0 _SignInScreenState.initState (package:flutter_sample/screens/signin_screen.dart:29:13)
I/flutter (11975): │ #1 StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4649:58)
I/flutter (11975): ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
I/flutter (11975): │ initState:
I/flutter (11975): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
I/flutter (11975): ┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
I/flutter (11975): │ #0 TestAsync.main (package:flutter_sample/service/TestAsync.dart:26:13)
I/flutter (11975): │ #1 _SignInScreenState.initState (package:flutter_sample/screens/signin_screen.dart:36:21)
I/flutter (11975): ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
I/flutter (11975): │ TestAsync: main: Fetching user order...
I/flutter (11975): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
I/flutter (11975): ┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
I/flutter (11975): │ #0 TestAsync.createOrderMessage (package:flutter_sample/service/TestAsync.dart:31:13)
I/flutter (11975): │ #1 TestAsync.main (package:flutter_sample/service/TestAsync.dart:27:21)
I/flutter (11975): ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
I/flutter (11975): │ TestAsync: createOrderMessage: BEFORE_WAIT
I/flutter (11975): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
I/flutter (11975): ┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
I/flutter (11975): │ #0 TestAsync.fetchUserOrder (package:flutter_sample/service/TestAsync.dart:39:13)
I/flutter (11975): │ #1 TestAsync.createOrderMessage (package:flutter_sample/service/TestAsync.dart:33:23)
I/flutter (11975): ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
I/flutter (11975): │ TestAsync: fetchUserOrder:
I/flutter (11975): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
I/flutter (11975): ┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
I/flutter (11975): │ #0 _SignInScreenState.build (package:flutter_sample/screens/signin_screen.dart:41:13)
I/flutter (11975): │ #1 StatefulElement.build (package:flutter/src/widgets/framework.dart:4628:28)
I/flutter (11975): ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
I/flutter (11975): │ build:
I/flutter (11975): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
I/flutter (11975): ┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
I/flutter (11975): │ #0 TestAsync.main (package:flutter_sample/service/TestAsync.dart:27:13)
I/flutter (11975): │ <asynchronous suspension>
I/flutter (11975): │ #1 _SignInScreenState.initState (package:flutter_sample/screens/signin_screen.dart:36:21)
I/flutter (11975): ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
I/flutter (11975): │ TestAsync: createOrderMessage: AFTER_WAIT Your order is: null
I/flutter (11975): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
I/flutter (11975): ┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
I/flutter (11975): │ #0 TestAsync.fetchUserOrder.() (package:flutter_sample/service/TestAsync.dart:44:21)
I/flutter (11975): │ #1 _rootRunUnary (dart:async/zone.dart:1198:47)
I/flutter (11975): ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
I/flutter (11975): │ TestAsync: fetchUserOrder: index = 1 then_value = Lat: 37.4219983, Long: -122.084
I/flutter (11975): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
I/flutter (11975): ┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
I/flutter (11975): │ #0 TestAsync.fetchUserOrder.() (package:flutter_sample/service/TestAsync.dart:44:21)
I/flutter (11975): │ #1 _rootRunUnary (dart:async/zone.dart:1198:47)
I/flutter (11975): ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
I/flutter (11975): │ TestAsync: fetchUserOrder: index = 0 then_value = Lat: 37.4219983, Long: -122.084
I/flutter (11975): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
I/flutter (11975): ┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
I/flutter (11975): │ #0 TestAsync.fetchUserOrder.() (package:flutter_sample/service/TestAsync.dart:44:21)
I/flutter (11975): │ #1 _rootRunUnary (dart:async/zone.dart:1198:47)
I/flutter (11975): ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
I/flutter (11975): │ TestAsync: fetchUserOrder: index = 3 then_value = Lat: 37.4219983, Long: -122.084如您所见,AFTER_WAIT您的订单是在之前的 print
TestAsync: fetchUserOrder: index =为什么?
发布于 2020-07-22 17:04:17
我找到了解决办法:
Future<String> createOrderMessage() async {
_logger.d("TestAsync: createOrderMessage: BEFORE_WAIT ");
// The "await" keyword only works within an async function.
var order = await fetchUserOrder();
// The next line will execute only after finish fetchUserOrder() because use "await and async".
return 'TestAsync: createOrderMessage: AFTER_WAIT Your order is: $order';
}
Future<Position> fetchUserOrder() async {
_logger.d("TestAsync: fetchUserOrder: START");
for (int index = 0; index < 10; index++) {
await Geolocator()
.getCurrentPosition(desiredAccuracy: LocationAccuracy.high)
.then((value) {
_logger
.d("TestAsync: fetchUserOrder: index = $index then_value = $value");
});
}
}这种帮助:
await Geolocator()https://stackoverflow.com/questions/63039352
复制相似问题