在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) 我有一个飞镖列表:
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)
解决这个问题的正确方法是什么?
以下代码无法以健全的 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)
在我看来,如果有很多参数,这会降低可读性。是否有更方便的解决方案支持以此进行初始化。在命名构造函数中?
.firstWhere((E element) -> bool) -> E我在我的项目中经常使用。当移植它以支持空安全时,我无法干净地处理在List实例中找不到元素的情况。
.firstWhere,.singleWhere并.lastWhere返回E,但E?在处理列表不包含所需元素的情况时则不然,除了null从例如转换整个列表之外没有其他方法可以返回。List<String>这List<String?>使得测试函数担心每个元素可能为空,但事实并非如此。在空安全之前,我只能使用orElse: () => null,但是使用空安全orElse必须返回类型的元素E,因此需要麻烦的转换。
我是否必须null为要使用的每种类型提供替代品orElse,或者是否有其他方法可以使列表检查支持 null 的缺失元素场景?
我在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) 在空安全之前,我可以简单地模拟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 做到这一点?我还能保持这个存根的通用特性并允许传入任何参数吗?
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}\nRun Code Online (Sandbox Code Playgroud)\n正文可能正常完成,导致返回“null”,但返回类型可能是不可为 null 的类型。
\nclass _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}\nRun Code Online (Sandbox Code Playgroud)\n参数类型“String Function(String)”无法分配给参数类型“String?” 函数(字符串?)?'。
\n这两个独立的代码位出现错误。我应该怎么办?
\n我不知道问题是什么/如何解决这个问题,当我尝试编码时它在测试文件夹 widget_test.dart 上显示此错误
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) 我一直在尝试调试此错误类型“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)