为空安全升级 Flutter 包时,我在运行时遇到此错误flutter test:
Error: A library can't opt out of null safety by default, when using sound null safety.
// @dart = 2.8
^^^^^^^^^^^^^^
Failed to load "/Users/xxxxx/test/text_test.dart":
Compilation failed
Run Code Online (Sandbox Code Playgroud)
答案就在那里,但我仍然困惑了一段时间,所以我在下面添加了我的答案。
我正在尝试将我的项目迁移到 Flutter Null Safety 版本,并且我正在遵循此官方迁移指南。
当我运行第二个命令时,它说
Package doesn't exist (the Flutter SDK is not available).
me@My-MacBook-Air my_project % dart --version
Dart SDK version: 2.12.0 (stable) (Thu Feb 25 19:50:53 2021 +0100) on "macos_x64"
me@My-MacBook-Air my_project %dart pub outdated --mode=null-safety
Package doesn't exist (the Flutter SDK is not available).
me@My-MacBook-Air my_project % `flutter doctor -v`
Flutter (Channel beta, 2.0.2, on macOS 11.2.3 20D91 darwin-x64, locale en-IN)
• Flutter version 2.0.2 at /Users/me/flutter
• …Run Code Online (Sandbox Code Playgroud) 我现在正在尝试 NNBD,我想知道您是否可以使用 new 关键字late和final一起使用。
据我了解,late属性可以在任何地方设置。您基本上是在告诉分析器,使用时它不会为空。
我认为这在某些情况下有点危险。
所以我想知道是否可以late final在 NNBD 中添加 a ,这会告诉分析器该属性必须在类构造函数中初始化。
有一个类似的问题,但我想当时没有零安全性: Dart。后期初始化最终变量
升级到 flutter 2.0.0 后,我无法再构建应用程序了。这是输出。我的问题是我大量使用库,其中很多都不是空安全的,我无法将所有依赖项升级到空安全模式。有没有人对此有任何建议?
Try calling using ?. instead.
).replaceFirst(r'$remainingCount', formatDecimal(remainingCount));
^^^^^^^^^^^^
../../flutter/flutter/.pub-cache/hosted/pub.dartlang.org/extended_image-1.6.0/lib/src/extended_image.dart:785:44: Error: No named parameter with the name 'nullOk'.
_invertColors = MediaQuery.of(context, nullOk: true)?.invertColors ??
^^^^^^
../../flutter/flutter/packages/flutter/lib/src/widgets/media_query.dart:818:25: Context: Found this candidate, but the arguments don't match.
static MediaQueryData of(BuildContext context) {
^^
../../flutter/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.18.1/lib/src/picture_provider.dart:50:59: Error: No named parameter with the name 'nullOk'.
context != null ? Localizations.localeOf(context, nullOk: true) : null,
^^^^^^
../../flutter/flutter/packages/flutter/lib/src/widgets/localizations.dart:413:17: Context: Found this candidate, but the arguments don't match.
static Locale localeOf(BuildContext context) {
^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
更新 …
我将 flutter 的 SDK 版本更改为 min ,以便我可以修复我的代码以确保空值安全。
有一个我不明白的问题,这一行产生了以下错误:
The argument type 'Color?' can't be assigned to the parameter type 'Color'
border: Border.all(color: Colors.grey[300], width: 1),
Run Code Online (Sandbox Code Playgroud)
但是如果我改变Colors.grey[300]任何不使用的值[],它就会工作,所以Colors.grey工作得很好。
我应该在这里更改什么以继续使用grey[300]?
我最近将我的 Flutter 应用程序迁移到空安全,但 WillPopScope 与 AlertDialog 结合使用会导致问题。WillPopScope期望Future<bool>但showDialog返回Future<bool?>,我不知道如何将一个投射到另一个上。
Widget _buildBody(BuildContext context) {
return WillPopScope(
onWillPop: (() => _onBackPressed(context)) as Future<bool> Function(),
child: new Container([...]),
);
}
// this should return a Future<bool> but showDialog doesn't allow that
Future<bool?> _onBackPressed(BuildContext context) async {
if (someCondition) {
// showDialog returns a Future<T?>
return showDialog(
context: context,
builder: (context) => new AlertDialog(
[...]
actions: <Widget>[
new TextButton(
child: Text("cancel",
onPressed: () => Navigator.of(context).pop(false),
),
new TextButton( …Run Code Online (Sandbox Code Playgroud) 在首次使用Dart/Flutter时,我创建了一个非常简单的演示应用程序,其中包含Drawer. 该应用程序在Android 模拟器中编译并启动,但不久后就中止并显示错误消息Null check operator used on a null value。在 之外Drawer,本地化工作完美无缺。
我到底做错了什么以及如何解决?
\n版本:
\nFlutter 2.2.0 \xe2\x80\xa2 channel stable \xe2\x80\xa2 https://github.com/flutter/flutter.git\nFramework \xe2\x80\xa2 revision b22742018b (12 days ago) \xe2\x80\xa2 2021-05-14 19:12:57 -0700\nEngine \xe2\x80\xa2 revision a9d88a4d18\nTools \xe2\x80\xa2 Dart 2.13.0\nRun Code Online (Sandbox Code Playgroud)\nGitHub 上提供了该应用程序的完整源代码:https://github.com/DarkPurpleKnight/null_issue
\n主要.dart:
\nimport \'package:flutter/material.dart\';\nimport \'package:flutter_localizations/flutter_localizations.dart\';\nimport \'package:flutter_gen/gen_l10n/app_localizations.dart\';\n\n\nvoid main() {\n runApp(NullIssueApp());\n}\n\nclass NullIssueApp extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return MaterialApp(\n title: \'Null issue\',\n localizationsDelegates: [\n AppLocalizations.delegate,\n GlobalMaterialLocalizations.delegate,\n …Run Code Online (Sandbox Code Playgroud) 在nullsafety.dartpad.dev 中,如果我编写以下代码:
void main() {
String? name = 'Bob';
print(name.length);
}
Run Code Online (Sandbox Code Playgroud)
我收到以下编译时错误:
值可以为“空”的表达式必须先进行空检查,然后才能取消引用
以及以下运行时错误:
无法在“字符串?”上访问属性“长度” 因为它可能为空。
该语言在什么样的表达方式会导致提升方面也更加聪明。一个明确的
== null或!= null当然的作品。但是使用as、赋值或后缀!运算符的显式转换也会导致提升。总体目标是,如果代码是动态正确的,并且可以合理地静态计算出来,那么分析应该足够聪明来做到这一点。
有没有可行的方法name可能是空在上面的代码。该文档还说分配应该导致类型提升。我误解了类型提升还是 DartPad 中的错误?
由于一些答案为错误消息提供了解决方法,我应该澄清一下,我不是在尝试解决上面的编码问题。相反,我是说我认为代码应该按原样工作。但事实并非如此。为什么不?
在尝试Dart的Sound Null Safety 时,我遇到了一个问题:
创建一个新的Flutter项目我发现以下(并且非常熟悉)片段代码
int _counter = 0;
void _incrementCounter() {
setState(() {
// This call to setState tells the Flutter framework that something has
// changed in this State, which causes it to rerun the build method below
// so that the display can reflect the updated values. If we changed
// _counter without calling setState(), then the build method would not be
// called again, and so nothing would appear …Run Code Online (Sandbox Code Playgroud) 以下代码无法以健全的 null 安全性进行编译,因为可以将 null 传递给初始化不可为 null 的字段myString的构造函数。
class MyClass {
String myString;
MyClass({@required this.myString});
}
Run Code Online (Sandbox Code Playgroud)
我希望在this.myString之后添加一个问号可以解决问题,但事实并非如此,并且会显示另一个编译错误。
默认值对我来说是没有选择的,似乎唯一的其他解决方案是这样的:
class MyClass {
late String myString;
MyClass({@required myString}) {
this.myString = myString;
}
}
Run Code Online (Sandbox Code Playgroud)
在我看来,如果有很多参数,这会降低可读性。是否有更方便的解决方案支持以此进行初始化。在命名构造函数中?