我有两种异步方法:
Future<void> checkForUpdate() async {
InAppUpdate.checkForUpdate().then((info) {
setState(() {
_updateInfo = info;
print('@@@@@@@@@@@@@@@@@@@@@@@@@@$_updateInfo');
});
}).catchError((e) => _showError(e));
}
Future<void> doImmediateUpdate(AppUpdateInfo info) async{
if(_updateInfo.immediateUpdateAllowed){
await InAppUpdate.performImmediateUpdate();
}
}
_updateInfo
是我在checkForUpdate()
中设置并在doImmediateUpdate
中使用的状态变量。我正在像这样调用这两种方法
`//.....'
platformUpdates() async {
if (Platform.isAndroid) {
await checkForUpdate();
await doImmediateUpdate(_updateInfo);
但是我遇到了错误
Unhandled Exception: NoSuchMethodError: The getter 'immediateUpdateAllowed' was called on null.
但是
_updateInfo
的print语句返回了我想要的。@@@@@@@@@@@@@@@@@@@@@@@@@@InAppUpdateState{updateAvailable: true, immediateUpdateAllowed: true, flexibleUpdateAllowed: true, availableVersionCode: 14}
显然我的代码中有些不对劲...
干杯。
最佳答案
使用await关键字而不是在checkForUpdate中设置回调:
Future<void> checkForUpdate() async {
final info = await InAppUpdate.checkForUpdate();
setState(() {
_updateInfo = info;
print('@@@@@@@@@@@@@@@@@@@@@@@@@@$_updateInfo');
});
}
当您使用then设置回调并且不使用await关键字时,它不等待将来解析值,而是继续执行代码-这就是为什么变量为null的原因。将来解决将来时,它将设置状态。但是当您使用await关键字时,代码将不会继续执行,直到将来解决。
没有的执行顺序等待:
调用
使用的执行顺序等待:
调用