状态变量的空值

时间:2019-11-13 09:42:43

标签: flutter dart

我有两种异步方法:

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}

很明显,我的代码中有些不对劲... 欢呼。

1 个答案:

答案 0 :(得分:2)

使用 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对象;
  • 等待未来解决;
  • 状态已设置为变量, checkForUpdate 功能已完成;
  • doImmediateUpdate 执行。