Flutter 中的空安全

自 Flutter 2 起,Flutter 开始支持空安全。你可以将你的 Flutter package 代码迁移,以使用非空类型,如下所示:

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  final int anInt = 3; // Cannot be null.
  final int? aNullableInt = null; // Can be null.

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Nullable Fields Demo',
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Nullable Fields Demo'),
        ),
        body: Center(
          child: Column(
            children: [
              Text('anInt is $anInt.'),
              Text('aNullableInt is $aNullableInt.'),
            ],
          ),
        ),
      ),
    );
  }
}

你可以观看由讲师带来的免费学习工坊的视频:

资源

你可以阅读以下内容,进一步学习空安全:

  • 健全的空安全:空安全的首页。它包括空安全的基础信息,以及你可能需要的其他所有内容的链接。

  • 深入理解空安全:对于空安全的深入解析,由 Dart 工程师 Bob Nystrom 撰写。

如果你即将开始迁移你的 package 至空安全,你可以阅读以下内容:

已知的问题

Flutter SDK 中的部分内容尚未支持空安全,它们仍然需要一些 迁移至空安全 的额外工作。

We’re currently aware of the following issues: 目前我们已经明确了以下的问题:

  • pub.dev 上 Flutter 团队的 packages 正在进行迁移。你可以查看 已迁移的 packages 列表。我们的计划是在未来几周将主要的 packages 迁移完成,唯一遗留的例外是 integration_tests,该 package 已被废弃,取而代之的是 Flutter SDK 本身的工具(见下文)。部分在 https://github.com/flutter/packages/tree/master/packages 的 package 可能需要更长的时间进行迁移。

  • 使用 flutter_driver 以及 Flutter SDK 中对应版本的 integration_test 进行集成测试。

    • 目前这些测试的方式,均未支持以空安全的方式在测试环境上运行。你可以运行空安全的应用,但测试本身不会使用 Dart 的空安全。

    • 当你的项目依赖 flutter_driverintegration_test 时,你可能无法升级 argsarchivecrypto 至已经迁移为空安全的版本,因为它们本身已经依赖了非空安全的版本(将导致版本冲突)。

    我们计划在 2021 年上半年解决该问题。

如果你对还未合并到 beta 和 stable 渠道的新改动感兴趣,并且愿意走在开发的前沿,可以考虑使用 dev 渠道 (flutter channel dev)。