我有两种异步方法:
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}
很明显,我的代码中有些不对劲... 欢呼。
答案 0 :(得分:2)
使用 await 关键字代替在 checkForUpdate 中设置回调:
Future<void> checkForUpdate() async {
final info = await InAppUpdate.checkForUpdate();
setState(() {
_updateInfo = info;
print('@@@@@@@@@@@@@@@@@@@@@@@@@@$_updateInfo');
});
}
当您使用 then 设置回调并且不使用 await 关键字时,它不会等待将来解析值,而是继续执行代码-这就是为什么变量为null。将来解决将来时,它将设置状态。但是当您使用 await 关键字时,代码将不会继续执行,直到将来解决。
没有等待的执行命令:
具有等待的执行命令: