标签: dart-null-safety

分配非空值文字时的空安全类型提升

nullsafety.dartpad.dev 中,如果我编写以下代码:

void main() {
  String? name = 'Bob';
  print(name.length);
}
Run Code Online (Sandbox Code Playgroud)

我收到以下编译时错误:

值可以为“空”的表达式必须先进行空检查,然后才能取消引用

以及以下运行时错误:

无法在“字符串?”上访问属性“长度” 因为它可能为空。

空检查文档的类型提升说:

该语言在什么样的表达方式会导致提升方面也更加聪明。一个明确的== null!= null当然的作品。但是使用as赋值或后缀!运算符的显式转换也会导致提升。总体目标是,如果代码是动态正确的,并且可以合理地静态计算出来,那么分析应该足够聪明来做到这一点。

有没有可行的方法name可能是空在上面的代码。该文档还说分配应该导致类型提升。我误解了类型提升还是 DartPad 中的错误?

澄清

由于一些答案为错误消息提供了解决方法,我应该澄清一下,我不是在尝试解决上面的编码问题。相反,我是说我认为代码应该按原样工作。但事实并非如此。为什么不?

dart type-promotion dart-null-safety

7
推荐指数
1
解决办法
839
查看次数

如何修复“无法无条件调用运算符 '{0}',因为接收器可以为 'null'”

在尝试DartSound 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)

dart flutter dart-null-safety

7
推荐指数
1
解决办法
2万
查看次数

如何在空安全 Dart 中将 List<String?> 转换为 List<String>?

我有一个飞镖列表:

List<String?> vals;
Run Code Online (Sandbox Code Playgroud)

我想删除任何空值并将其转换为List<String>. 我试过了:

List<String> removeNulls(List<String?> list) {
  return list.where((c) => c != null).toList() as List<String>;
}
Run Code Online (Sandbox Code Playgroud)

在运行时,我收到以下错误:

List<String?>' is not a subtype of type 'List<String>?'
Run Code Online (Sandbox Code Playgroud)

解决这个问题的正确方法是什么?

dart dart-null-safety

7
推荐指数
1
解决办法
593
查看次数

具有所需参数和 null 安全性的命名构造函数

以下代码无法以健全的 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)

在我看来,如果有很多参数,这会降低可读性。是否有更方便的解决方案支持以此进行初始化在命名构造函数中?

dart flutter dart-null-safety

7
推荐指数
2
解决办法
6850
查看次数

Dart 列表中的空感知 .firstWhere、.singleWhere、.lastWhere?

.firstWhere((E element) -> bool) -> E我在我的项目中经常使用。当移植它以支持空安全时,我无法干净地处理在List实例中找不到元素的情况。

.firstWhere.singleWhere.lastWhere返回E,但E?在处理列表不包含所需元素的情况时则不然,除了null从例如转换整个列表之外没有其他方法可以返回。List<String>List<String?>使得测试函数担心每个元素可能为空,但事实并非如此。在空安全之前,我只能使用orElse: () => null,但是使用空安全orElse必须返回类型的元素E,因此需要麻烦的转换。

我是否必须null为要使用的每种类型提供替代品orElse,或者是否有其他方法可以使列表检查支持 null 的缺失元素场景?

dart flutter dart-null-safety null-safety

7
推荐指数
2
解决办法
6166
查看次数

如何在 Dart 的 Sound Null Safety 中递增/递减可为空的表达式:`&lt;nullable_variable&gt;!++`?

我在Dart 中使用Sound Null Safety,我有以下代码

int? _counter;

void _incrementCounter() {
  setState(() {
    if (_counter!=null)
      _counter++;
  });
}
Run Code Online (Sandbox Code Playgroud)

现在,由于 _counter 不是局部变量,因此无法提升它(请参阅此其他线程以了解原因),因此我必须通过添加bang 运算符( )来告诉Dart我确信_counter它不为空。因此我写了!

_counter!++;
Run Code Online (Sandbox Code Playgroud)

但这不起作用:我收到错误消息

非法赋值给不可赋值的表达式。

那么,有没有办法解决这个问题,而无需显式编写

_counter = _counter! + 1;
Run Code Online (Sandbox Code Playgroud)

dart flutter dart-null-safety

6
推荐指数
1
解决办法
920
查看次数

Mockito - 在空安全迁移后存根一个方法

在空安全之前,我可以简单地模拟sendRequest(...)方法,如下所示:

 void stubBaseRepositorySendRequestResponse(String response) {
    when(baseRepository.sendRequest(onGetData: anyNamed('onGetData')))
        .thenAnswer((_) {
      return Future<String>.value(response);
    });
  }
Run Code Online (Sandbox Code Playgroud)

这个方法的签名是:

Future<T> sendRequest<T>({required Future<T> Function() onGetData})
Run Code Online (Sandbox Code Playgroud)

如何使用新的空安全版本的 mockito 做到这一点?我还能保持这个存根的通用特性并允许传入任何参数吗?

mockito dart flutter-test dart-null-safety

6
推荐指数
2
解决办法
1254
查看次数

错误:参数类型“String Function(String)”无法分配给参数类型“String?” 函数(字符串?)?'

class StudentValidationMixin {\n\n    String validateFirstName(String value) {\n      if(value.length<2){\n        return '\xc4\xb0sim en az iki karakter olmal\xc4\xb1d\xc4\xb1r';\n    }\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

正文可能正常完成,导致返回“null”,但返回类型可能是不可为 null 的类型。

\n
class _StudentAddState extends State with StudentValidationMixin {\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: Text("Yeni \xc3\xb6\xc4\x9frenci ekle"),\n      ),\n      body: Container(\n        margin: EdgeInsets.all(20.0),\n        child: Form(\n          child: Column(\n            children: <Widget>[\n              TextFormField(\n                decoration: InputDecoration(labelText: "\xc3\x96\xc4\x9frenci Ad\xc4\xb1", hintText: "Fatih"),\n                validator: validateFirstName,\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

参数类型“String Function(String)”无法分配给参数类型“String?” 函数(字符串?)?'。

\n

这两个独立的代码位出现错误。我应该怎么办?

\n

flutter dart-null-safety

6
推荐指数
1
解决办法
6175
查看次数

名称“MyApp”不是一个类。尝试更正名称以匹配现有的类。扑

我不知道问题是什么/如何解决这个问题,当我尝试编码时它在测试文件夹 widget_test.dart 上显示此错误

在此输入图像描述X

 testWidgets('Counter increments smoke test', (WidgetTester tester) async {
    // Build our app and trigger a frame.
    await tester.pumpWidget(const MyApp());
Run Code Online (Sandbox Code Playgroud)

dart flutter flutter-test flutter-layout dart-null-safety

6
推荐指数
1
解决办法
2万
查看次数

如何解决错误“类型‘Null’不是类型转换中类型‘String’的子类型”

我一直在尝试调试此错误类型“Null”不是类型转换中“String”类型的子类型,但无法找到产生错误的确切位置,除了触发 POST API 调用时生成错误之外。

店铺等级

import 'package:freezed_annotation/freezed_annotation.dart';
part 'shop.freezed.dart';
part 'shop.g.dart';

@freezed
class Shop with _$Shop {
  factory Shop({
      String? id,
      @JsonKey(name: 'shopNumber')String? number,
      @JsonKey(name: 'created') String? createdAt,
      @JsonKey(name: 'updated') String? updatedAt,
      int? calendar}) = _Shop;

  factory Shop.fromJson(Map<String, dynamic> json) => _$ShopFromJson(json);

  static Shop fromJsonModel(Map<String, dynamic> json) => Shop.fromJson(json);
}
Run Code Online (Sandbox Code Playgroud)

后期功能-创建店铺

Future<void> postShop() async {
    Shop shop;
    
    shop = await shopSvc.create(Shop(calendar: widget.calendar?.id, number: _shopNumber));

        var newCalendar = widget.calendar?.copyWith(shop: shop);
        Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) => ShopInfoScreen(calendar: newCalendar!)));
      }
    } catch …
Run Code Online (Sandbox Code Playgroud)

http dart flutter dart-null-safety

6
推荐指数
1
解决办法
1万
查看次数