是否有可能在使用旧包时为/lib代码启用NNBD ?



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

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

混合版本程序以不可靠的null安全运行。对于null也是可能的引用错误可能在运行时发生,但仅因为null或nullable从某个空不安全的库中进行类型转义,进入空安全的代码。

但是编译器似乎不同意。

我有一个pubspec:

environment:
sdk: '>=2.12.0-0 <3.0.0'
dependencies:
flutter:
sdk: flutter
statsfl:

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

[EDIT]当我尝试让遗留包由2.12编译器处理时,它不会构建:"错误:由于下列依赖项,无法使用声音null安全运行- package:statsfl">[/EDIT]

根据文档,我应该使用unsound null safety为此,可以在入口点中放置//@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));
}
}

但这不是混合模式,编译器不允许我的代码使用不健全的null安全,它就会完全禁用它。编译器对i没有抛出错误,但不理解?的语法

我想做的是将@dart=2.9应用于所有依赖项,而不是其他方式。

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

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

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

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

相关内容

最新更新