首页 > 解决方案 > 是否可以在使用旧包时为您的 /lib 代码启用 NNBD?

问题描述

我想为我自己的视图和业务逻辑启用 NNBD,而不用担心升级外部包。这可能吗?

在这里阅读文档,这似乎是可能的:https ://dart.dev/null-safety/unsound-null-safety

混合版本程序以不健全的空安全性运行。在运行时可能会发生空引用错误,但这只是因为空或可空类型从某些空不安全库中转义并进入空安全代码。

但编译器似乎不同意。

我有一个像这样的 pubspec:

environment:
  sdk: '>=2.12.0-0 <3.0.0'

dependencies:
  flutter:
    sdk: flutter

  statsfl:

statsfl是一个遗留库。我想在我的主视图中使用 NNBD,而不用担心statsfl内部问题。

[编辑] 当我尝试让遗留包由 2.12 编译器处理时,它不会构建: “错误:无法以健全的空安全运行,因为以下依赖项不支持空安全:-package:statsfl” [/编辑]

根据文档,我应该为此使用不健全的空安全性,这是通过放置在您的入口点中的 //@dart=2.9 启用的。

所以我有这样的事情:

//@dart=2.9
import 'package:flutter/material.dart';
import 'package:statsfl/statsfl.dart';

void main() {
  runApp(MaterialApp(
    builder: (_, __) => _MyPage(),
  ));
}

class _MyPage extends StatefulWidget {
  @override
  __MyPageState createState() => __MyPageState();
}

class __MyPageState extends State<_MyPage> {
  int i;

  @override
  Widget build(BuildContext context) {
    return StatsFl(child: Container(color: Colors.orange));
  }
}

但这不是混合模式,编译器不允许我的代码使用unsound null safety,它只是完全禁用它。编译器不会抛出关于 的错误i,并且不理解?语法。

我想要做的是将 //@dart=2.9 应用于所有依赖项,而不是相反。

标签: flutterdart

解决方案


要回答我自己的问题,文档中并不清楚,但 --no-sound-null-safety如果您想在使用 2.12 时使用旧版库运行,则必须使用它。

我在文档中对此感到困惑,因为它是一个运行时标志,我认为必须在编译时执行一些操作才能启用它。我没有意识到允许 nnbd 代码在运行时实际工作需要该标志。

我最终在这里提出了一个问题; https://github.com/dart-lang/language/issues/1475

如果有一些关于如何设置 VSCode 和 Android Studio 以在 GUI 中支持这一点的指导,那就太好了。


推荐阅读