如何在Flutter中启用Null-Safety?

57

我尝试使用空安全(null safety),但是出现了以下错误:

需要启用“非空”语言特性。请尝试更新您的pubspec.yaml文件,将最小SDK版本设置为2.10.0或更高,并运行“pub get”命令。

我把Dart SDK约束从2.7.0改为2.10.0,但仍显示此错误。

图片描述

另外,我已升级Dart和Flutter SDK:

基于您的资源来源,dart-sdk v2.10.2是最新版本。

Flutter (Channel stable, 1.22.3, ...

8个回答

74

从 Dart 2.12 开始,空值安全已经不再是实验性的了。现在启用它也很容易。

启用空值安全

从第一个 Dart 2.12 版本开始,类型默认情况下将为不可为空。所以你只需要改变你的 SDK 约束:

environment:
  sdk: ">=2.12.0 <3.0.0"

了解有关在 dart.dev 上“启用空值安全”的更多信息,请访问"启用空值安全"


现在已经稳定了(Flutter 2.0.0) - Vinoth Vino
出现错误:[chatflutter] flutter pub get 正在 chatflutter 中运行 "flutter pub get"... 当前 Dart SDK 版本为 2.12.0-133.7.beta。由于 chatflutter 要求 SDK 版本 >=2.12.0 <3.0.0,版本解决失败。 pub get 失败 (1; 因为 chatflutter 要求 SDK 版本 >=2.12.0 <3.0.0,版本解决失败。) 退出码 1 - Kamlesh
@Kamlesh 请确保运行 flutter upgrade :) Flutter 2.0.0 已经发布,其中包含了 Dart 2.12.0。 - creativecreatorormaybenot
1
我已经开发了这个应用程序,如果我选择使用Dart 2.12版本的空安全特性,那么它将使我倒退10天来解决所有在应用Dart 2.12版本的空安全特性后引发的问题。顺便说一下,我已经将Flutter版本更新到了2.0.0,并在我的应用程序中进行了Flutter UI更改。我复制了我的应用程序并应用了Dart 2.12版本,然后解决了与Dart 2.12更新相关的问题,浪费了11-12个小时,因为许多软件包不兼容Dart 2.12的空安全特性,所以今天我回滚了我的应用程序。非常感谢。 - Kamlesh
Dart 还表示要等待您所依赖的软件包进行迁移,因此不建议使用具有空安全功能的 Dart 2.12 进行迁移。https://dart.dev/null-safety/migration-guide - Kamlesh
我认为一旦你得到了绿灯,尽快迁移是很好的选择,@Kamlesh。就像你所说的那样,在此之前,_你只需要等待你的依赖关系_。 - Zamorite

51

启用空安全性:

  1. 检查最新的Dart版本(应该是Dart 2.12或更高版本):

    dart --version
    
  2. 如果上述步骤不满足要求,请使用以下命令更新Dart版本:

    dart pub upgrade --null-safety
    
    dart pub get
    
  3. 运行以下命令,了解项目中哪些库需要升级到最新的空安全版本:

    dart pub outdated --mode=null-safety
    

最新列显示当前版本,如果是绿色的,表示依赖已经实现了空安全特性;如果是红色的,则表示依赖的所有者需要进行实现。

enter image description here

  1. 最后,运行Dart迁移命令,在现有项目上执行空安全迁移(现有项目)

    dart migrate
    
  2. 如果您的软件包已准备好进行迁移,则该工具会生成以下类似的行:

    通过访问以下链接查看迁移建议:

    http://127.0.0.1:60278/Users/you/project/mypkg.console-simple?authToken=Xfz0jvpyeMI%3D

注意:即使运行了upgrade --null-safety 命令,你仍然会看到最新的列部分显示为红色,这意味着某个依赖项尚未支持null安全性,因此无法迁移该项目。
详情请阅读:https://dart.dev/null-safety/migration-guide

10

Flutter 2.0.0 稳定版之后,您可以在应用程序的 根目录 中运行:

dart migrate --apply-changes

6
这可能会发生在你升级了使用的Flutter版本时。
尝试将以下内容添加到analysis_options.yml中。
analyzer:
    - enable-experiment:
        - non-nullable

接下来,尝试再次清理并升级项目依赖项。
为此,您可以使用以下命令:

flutter clean
flutter packages pub upgrade
flutter pub run build_runner build

最后,重新启动你的IDE。

另外,请确保你正在使用的SDK与你的Flutter版本兼容。


我必须导入一些东西吗? - Abdallah El-Rashedy
你可以尝试重新启动你的IDE吗? - Mirko Raimo
1
@AbdallahEl-Rashedy,现在不再需要enable-experiment了,请参见我的回答 - creativecreatorormaybenot

6

按照Dart文档中的指示,我采取了以下步骤在Flutter中启用空值安全:

首先添加analysis_options.yaml文件:

analyzer:
  enable-experiment:
    - non-nullable

然后切换到开发通道并升级:

flutter channel dev
flutter upgrade

pubspec.yaml中更改SDK版本。

environment:
  sdk: ">=2.11.0-213.0.dev <2.12.0"

清理项目:

flutter clean
flutter pub get

重新启动IDE(在我的情况下是VS Code)。

然后它就正常运行了。


现在,NNBD不再是一个实验。请参见我的答案 - creativecreatorormaybenot

3
  1. Set the lower Dart SDK constraint to 2.12 in your pubspec.yaml file.

    environment:
      sdk: ">=2.12.0 <3.0.0"
    
  2. Check if all the packages of your app are migrated to null safety.

    dart pub outdated --mode=null-safety
    
  3. If they are migrated, update all the packages to their null safe variant.

    dart pub upgrade --null-safety 
    dart pub get
    
  4. Start the migration process.

    dart migrate
    

    If you're happy with the changes, apply them using:

    dart migrate --apply-changes  
    

2

我已经尝试了上述所有方法,但分析器仍然提示需要启用空安全。对我而言解决方案是运行pub upgrade而不是pub get。即使我不知道为什么它能解决问题,我还是会继续工作!


1
我甚至不想去找出原因,我只想回去工作!这是我在尝试解决问题后得到的人生经验 :) - rgv

0

我确认即使在2022年,仍然可以通过以下方式进行操作...

环境: SDK: ">=2.12.0 <3.0.0"


1
我遇到了完全相同的问题,我的Dart和Flutter都是最新版本。Pubspec.yaml文件是正确的。已经重新启动了Android Studio。Flutter pub get也已经运行过。 - E.Bradford

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接