所以我有一个类Cache,它有compare一个返回bool.
我有一个可为空的类的实例。
Cache? recent;
Run Code Online (Sandbox Code Playgroud)
recent我想在isnot null和comparereturn时执行一段代码false
如果没有零安全性,我就会这样做
if(recent!=null && !recent.compare()){
//code
}
Run Code Online (Sandbox Code Playgroud)
如何在启用空安全的情况下执行相同的操作?
当我尝试上面的零安全性时,我得到
无法无条件调用“compare”方法,因为接收者可能为“null”。尝试使调用有条件(使用“?。”)或向目标添加空检查(“!”)
当我尝试下面时
if(!recent?.compare()){
//code
}
Run Code Online (Sandbox Code Playgroud)
它给了我
可为空的表达式不能用作条件。在将其用作条件之前,请尝试检查该值是否不为“null”。
我大约一年前正在学习颤振,现在我休息后回来,但我遇到了一个问题,它可能很简单,但我不太理解它。
我正在关注 Flutter Clean Architecture 的教程,当我编写第一个测试时,我收到一条错误消息:“必须先分配不可为空的局部变量‘mockNumberTriviaRepository’,然后才能使用它。” 我不知道如何将其编写为正确的代码。
我的代码如下:
class MockNumberTriviaRepository extends Mock
implements NumberTriviaRepository {}
void main() {
GetConcreteNumberTrivia usecase;
MockNumberTriviaRepository mockNumberTriviaRepository;
setUp(() {
MockNumberTriviaRepository mockNumberTriviaRepository = MockNumberTriviaRepository();
usecase = GetConcreteNumberTrivia(mockNumberTriviaRepository);
});
final tNumber = 1;
final tNumberTrivia = NumberTrivia(number: 1, text: 'test');
test('schould get trivia for the number from the repository', () async {
// arrange
when(**mockNumberTriviaRepository**.getConcreteNumberTrivia(1)).thenAnswer((_) async => Right(tNumberTrivia));
// act
// assert
});
}
Run Code Online (Sandbox Code Playgroud)
错误出现在测试函数中when方法之后** ** this 标志之间的部分
我有一个像这样的简单课程:
class Restaurant{
final String id;
final String name;
List<Serving> servingList;
Restaurant({
required this.id,
required this.name,
this.servingList = [], // ERROR
});
}
Run Code Online (Sandbox Code Playgroud)
默认情况下,我想要一个空列表servingList,并稍后将对象添加到该列表中。但我收到错误消息The default value of an optional parameter must be constant.
我需要做什么?
我感谢每一个帮助,谢谢!
我有:
Future<bool> foo() async => true;
Run Code Online (Sandbox Code Playgroud)
这是允许的:
Future<void> bar() {
return foo(); // Works
}
Run Code Online (Sandbox Code Playgroud)
但这不是:
Future<void> baz() async {
return foo(); // Error
}
Run Code Online (Sandbox Code Playgroud)
在两者中bar,baz我都返回 a Future<bool>,但为什么第一个有效但第二个失败?
注意:这个问题不是关于如何让它工作,而是关于为什么一个有效而另一个无效。
javascript dart flutter flutter-dependencies dart-null-safety
[信息] 预编译构建脚本...... [警告] ../../flutter/.pub-cache/hosted/pub.dartlang.org/gql_code_builder-0.2.0/lib/src/ast.dart: 618:12:错误:必须返回非空值,因为返回类型“表达式”不允许为空。
[严重] 无法预编译构建脚本 .dart_tool/build/entrypoint/build.dart。这可能是由错误配置的构建器定义引起的。
当我在语句中使用变量时,Dart 编译器不明白该变量不能为 nullif (x != null)。它仍然需要使用条件?或空检查!运算符来访问变量的字段或方法之一。
这是一个例子:
String? string;
void test() {
if (string != null) {
print(string.length);
}
}
Run Code Online (Sandbox Code Playgroud)
这会产生一个编译时错误并表示
无法无条件访问属性“length”,因为接收者可以为“null”。尝试使访问成为有条件的(使用“?.”)或向目标添加空检查(“!”)。
然而,接收者实际上不能为空,因为它是用if (string != null)块包裹的。string?.length使用或访问字段string!.length效果很好,但当我需要使用变量的不同字段或方法时,可能会感到困惑。
String? string;
void test() {
if (string != null) {
print(string.length);
print(string.isNotEmpty);
print(string.trim());
print(string.contains('x'));
}
}
Run Code Online (Sandbox Code Playgroud)
所有这些陈述都会引发相同的错误。我也尝试放置assert(string != null);,但编译器仍然不明白该字符串不为空。
举一个更复杂的例子;
User? user;
@override
Widget build(BuildContext context) {
if (user == null) {
return Text('No user available');
} else { …Run Code Online (Sandbox Code Playgroud) 问题:
一些 pub 包还不支持空安全。
例如intl_translation无法解析具有空安全运算符的文件,并且如果找到任何符号(如 ?、! 等),则会抛出如下错误。
Invalid argument(s): Parsing errors in lib/localizations/MainLocalizations.dart
#0 MessageExtraction._parseCompilationUnit (package:intl_translation/extract_messages.dart:117:7)
#1 MessageExtraction.parseContent (package:intl_translation/extract_messages.dart:102:14)
#2 MessageExtraction.parseFile (package:intl_translation/extract_messages.dart:87:12)
#3 main (file:///.../flutter/.pub-cache/hosted/pub.dartlang.org/intl_translation-0.17.10+1/bin/extract_to_arb.dart:98:31)
#4 _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:281:32)
#5 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:184:12)
Run Code Online (Sandbox Code Playgroud)
然后它生成不使用空安全的 dart 文件,并在$ flutter run.
那么有没有办法至少为成功编译禁用警告或空安全?因为
$ flutter run --no-sound-null-safety没有帮助:(
感谢您的任何帮助!
在完善的空安全到来后,仍然有依赖项还没有升级到空安全的项目,仍然可以--no-sound-null-safety通过 Flutter 命令使用flag运行。
但是现在我正在尝试通过android项目运行该应用程序。我尝试这样做的原因是为了让我调试原生 Flutter 插件。我android在 Android Studio 上打开文件夹,当我尝试运行该项目时,收到错误消息:
Error: Cannot run with sound null safety, because the following dependencies don't support null safety:
Run Code Online (Sandbox Code Playgroud)
如果我正在运行 Flutter 命令,我提到的标志将在这里工作。但是在android通过 Android Studio运行项目时如何设置这个标志?
flutter flutter-dependencies flutter-plugin dart-null-safety
我正在使用启用了空安全的新 dart 版本 <2.13.0-107.0.dev>。
有了这个任务列表:
List<Task> tasks = [
Task(name: 'find a way to live happy'),
Task(name: 'Listen to music!!!'),
Task(name: 'Live in the other world till ur power is off'),
];
Run Code Online (Sandbox Code Playgroud)
当我尝试在 ListView.builder 构造函数中使用它时:
@override
Widget build(BuildContext context) {
return ListView.builder(
itemCount: tasks.length,
itemBuilder: (context, index) {
TaskTile(
taskTitle: tasks[index].name,
isChecked: tasks[index].isDone,
checkboxCallback: (bool? checkboxState) {
setState(() {
tasks[index].toggleDone();
});
},
);
},
);
}
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
错误:主体可能正常完成,导致返回“空”,但返回类型可能是不可为空的类型。
以及运行日志中的此错误:
错误:必须返回非空值,因为返回类型“Widget”不允许为空。
有关更多信息,Task 类定义如下:
class Task {
String name;
bool isDone;
Task({this.name …Run Code Online (Sandbox Code Playgroud) dart-null-safety ×10
dart ×9
flutter ×8
class ×1
constructor ×1
dart-pub ×1
flutter-test ×1
javascript ×1