我有两种异步方法:

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关键字时,代码将不会继续执行,直到将来解决。

没有的执行顺序等待:

调用
  • checkForUpdate,调用InAppUpdate.checkForUpdate并返回Future对象。
  • 为Future对象设置了回调,checkForUpdate函数完成;
  • doImmediateUpdate执行;
  • (Future解决之前的异步间隔)
  • 调用checkForUpdate的将来回调并设置状态。

  • 使用的执行顺序等待:

    调用
  • checkForUpdate,调用InAppUpdate.checkForUpdate并返回Future对象。
  • 等待 future 解决;
  • 将变量设置为状态,checkForUpdate函数完成;
  • doImmediateUpdate执行。
  • 10-08 16:37