flutter - 是否可以在使用旧包时为您的 /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 应用于所有依赖项,而不是相反。
解决方案
要回答我自己的问题,文档中并不清楚,但
--no-sound-null-safety
如果您想在使用 2.12 时使用旧版库运行,则必须使用它。
我在文档中对此感到困惑,因为它是一个运行时标志,我认为必须在编译时执行一些操作才能启用它。我没有意识到允许 nnbd 代码在运行时实际工作需要该标志。
我最终在这里提出了一个问题; https://github.com/dart-lang/language/issues/1475
如果有一些关于如何设置 VSCode 和 Android Studio 以在 GUI 中支持这一点的指导,那就太好了。
推荐阅读
- c++ - 我设法修复了错误(LNK1169 和 LNK2005),但为什么会这样?
- amazon-web-services - 使用我的减速器和映射器创建 emr 集群时出现错误 403?
- c# - 使用 EF6 保存新记录时主键已存在
- mysql - 是否可以通过 ssl 将 typeorm 连接到 sql gcloud 的实例?
- antlr4 - 如何知道我必须解析多少相同的结构
- shell - 递归复制文件夹:Shell
- javascript - 如何在不下载的情况下获取图像 URL?
- android - 如何从另一个活动中返回后按时列表视图的滚动位置
- wordpress - 使用动态用户元填充多个字段
- progressive-web-apps - 在渐进式 Web 应用程序中是否可以实现真正的持久存储?