我想为我自己的视图和业务逻辑启用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以支持此功能的指导就太好了。