警告:空感知操作“!”的操作数 具有类型“SchedulerBinding”,不包括 null

isa*_*isa 24 dart flutter

更新 Flutter 3.0 后出现以下编译错误。此错误没有引用我的代码。它指的是框架。

\n
Launching lib/main.dart on Chrome in debug mode...\nlib/main.dart:1\n: Warning: Operand of null-aware operation '!' has type 'SchedulerBinding' which excludes null.\n../\xe2\x80\xa6/src/framework.dart:275\n- 'SchedulerBinding' is from 'package:flutter/src/scheduler/binding.dart' ('../snap/flutter/common/flutter/packages/flutter/lib/src/scheduler/binding.dart').\npackage:flutter/\xe2\x80\xa6/scheduler/binding.dart:1\n    if (SchedulerBinding.instance!.schedulerPhase ==\n
Run Code Online (Sandbox Code Playgroud)\n

Cop*_*oad 17

当您迁移到 Flutter 3.0 时,这是预期的。文档还提到了这一点

\n
Warning: Operand of null-aware operation \'!\' has type \'SchedulerBinding\' which excludes null.\n
Run Code Online (Sandbox Code Playgroud)\n
\n

这些是由于 API 的简化(绑定上的实例属性现在不可为空)以及急切的编译器(希望报告使用冗余空感知运算符(例如 ! 和 ?.)的任何情况)而引起的。当它们\xe2\x80\x99 不是必需的时。

\n
\n

解决方案:

\n
    \n
  1. 您可以通过运行来更新您的软件包flutter pub upgrade

    \n
  2. \n
  3. 如果问题仍然存在(例如,某些软件包仍然给您此错误),您可以忽略它,因为这只是一个警告,或者只需编辑源文件并删除?和/或!.

    \n
  4. \n
\n


小智 12

请注意,这是一个警告,而不是错误:应用程序将编译并运行得很好。

这基本上意味着在代码中的许多地方(在第 3 方包中,我认为也在某些第 1 方实例中)存在空检查,现在这是多余的。也就是说,在你使用之前

SchedulerBinding.instance!.someField == ...
Run Code Online (Sandbox Code Playgroud)

因为SchedulerBinding.instance有类型SchedulerBinding?,它可能(技术上)为空。由于在实践中!使用了该运算符,因此它已被假定为不为 null,并且随着 SDK 中的新更改,他们更改了类型,因此它实际上永远不会为 null。现在,你可以简单地说

SchedulerBinding.instance.someField == ...
Run Code Online (Sandbox Code Playgroud)

如果您仍然包含!or?运算符,您的 IDE 将警告您,这是多余的检查,因为实例永远不能为空。不幸的是,我们将一直受到这些警告的困扰,直到您使用的包和 Flutter 本身解决这个问题,但您绝对可以忽略它们,因为不必要的空检查永远不会破坏您的代码。