如何在 Flutter 中启用 Null-Safety?

Posted

技术标签:

【中文标题】如何在 Flutter 中启用 Null-Safety?【英文标题】:How to enable Null-Safety in Flutter? 【发布时间】:2021-02-13 15:56:08 【问题描述】:

我尝试使用空安全,但它给了我这个错误:

这需要启用“不可为空”语言功能。尝试 更新您的 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(通道稳定,1.22.3,...

【问题讨论】:

【参考方案1】:

    pubspec.yaml 文件中将 Dart SDK 下限设置为 2.12

    environment:
      sdk: ">=2.12.0 <3.0.0"
    

    检查您应用的所有包是否都迁移到空安全。

    dart pub outdated --mode=null-safety
    

    如果它们被迁移,请将所有包更新为它们的空安全变体。

    dart pub upgrade --null-safety 
    dart pub get
    

    开始迁移过程。

    dart migrate
    

    如果您对更改感到满意,请使用:

    dart migrate --apply-changes  
    

【讨论】:

【参考方案2】:

启用空值安全,

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

    dart --version
    

    更新dart版本,使用命令不满足以上几点。

    dart pub upgrade --null-safety
    
    dart pub get
    

    运行以下命令以了解您项目中的哪些库需要升级到最新的 null 安全性。

    dart pub outdated --mode=null-safety
    

最新列显示当前版本,如果它是绿色的,这意味着依赖项实现了空安全功能,如果它是红色的,那么依赖项所有者需要实现它。

    最后,运行 dart 迁移命令,对现有项目(现有项目)执行空安全迁移

    dart migrate
    

    如果您的包已准备好迁移,则该工具会生成如下所示的一行:

    通过访问查看迁移建议:

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

注意: 即使在运行upgrade --null-safety 命令后,您仍会看到最新的列部分为红色,这意味着特定依赖项尚不支持空安全性,因此您无法迁移项目.

详情请阅读:https://dart.dev/null-safety/migration-guide

关于实现空安全的好博客:https://medium.com/flutterworld/flutter-null-safety-5d20012c2441

【讨论】:

【参考方案3】:

Flutter 2.0.0稳定版后可以在应用root文件夹中运行:

dart migrate --apply-changes

【讨论】:

【参考方案4】:

Null 安全性不再是实验 截至 Dart 2.12。现在很容易启用。

启用零安全

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

environment:
  sdk: ">=2.12.0 <3.0.0"

详细了解"Enabling null safety" on dart.dev。

【讨论】:

现在稳定了(Flutter 2.0.0) 出现错误:[chatflutter] flutter pub get Running "flutter pub get" in chatflutter... 当前 Dart SDK 版本为 2.12.0-133.7.beta。因为 chatflutter 需要 SDK 版本 >=2.12.0 =2.12.0 @Kamlesh 请确保运行flutter upgrade :) Dart 2.12.0 从 Flutter 2.0.0 开始可用。 我已经开发了应用程序,如果我使用具有 null 安全功能的 Dart 2.12 版本,那么在应用具有 null 安全功能的 Dart 2.12 版本后,我将需要 10 天的时间来解决出现的所有问题。顺便说一句,我已将颤振版本更新为 2.0.0,并在我的应用程序中进行了颤振 ui 更改。我复制了我的应用程序并应用了 Dart 2.12 版本,然后在我的应用程序中修复了与 Dart 2.12 更新相关的问题,浪费了 11-12 个小时,这是浪费时间,因为许多软件包与 Dart 2.12 空安全功能不兼容,然后我回滚了我今天的申请。非常感谢。 Dart 还说等待您依赖迁移的包,因此迁移到具有空安全功能的 Dart 2.12 并不好。 dart.dev/null-safety/migration-guide【参考方案5】:

我已经完成了上述所有操作,但由于某种原因,分析器仍然给出了关于启用 null 安全性的错误。为我解决的问题是运行 pub upgrade 而不是 pub get。我什至不会试图找出原因,我只是要回去工作!

【讨论】:

"我什至不打算找出原因,我只是要回去工作!"在尝试解决此问题后,我将此作为人生的教训:)【参考方案6】:

按照Dart documentation,我能够通过以下步骤在 Flutter 中启用 null 安全性:

先添加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 不再是一个实验。见my answer。【参考方案7】:

当您升级正在使用的 Flutter 版本时,可能会发生这种情况。

尝试将以下内容添加到 analysis_options.yml

analyzer:
    - enable-experiment:
        - non-nullable

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

flutter clean
flutter packages pub upgrade
flutter pub run build_runner build

最后,重新启动你的 IDE。

附:对了,请确保您使用的 sdk 与您的 Flutter 版本兼容

【讨论】:

我必须导入一些东西吗? 你可以尝试重启你的ide吗? ***.com/a/62153557/10907417 @AbdallahEl-Rashedy 现在不再需要enable-experiment;见my answer。

以上是关于如何在 Flutter 中启用 Null-Safety?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 flutter_webview 插件在 Flutter 中启用位置?

如何在 Flutter 中启用/禁用 Firebase Crashlytics

如何在 Flutter 中启用 Null-Safety?

如何在 Flutter 中的某些布尔条件下启用按钮?

如何在flutter webview中启用全屏模式

NULL-safe equal