dart null 安全和打字问题
dart null safety and typing issues
我正在尝试学习 Dart,但我真的很难理解 Null Safety。我有下面的函数,我直接从开发示例 (https://pub.dev/packages/udp) 中复制了它,并稍微调整了我的代码。
void udpConnection(port) async {
var sender = await UDP.bind(Endpoint.any(port: Port(65000)));
var dataLength = await sender.send('Hello World!'.codeUnits, Endpoint.broadcast(port: Port(port)));
var receiver = await UDP.bind(Endpoint.loopback(port: Port(65002)));
try {
receiver.asStream(timeout: Duration(seconds: 20)).listen((datagram) {
String s = new String.fromCharCodes(datagram.data);
print(s);
});
} catch(e) {
print(e);
}
// close the UDP instances and their sockets.
sender.close();
receiver.close();
}
但我收到以下错误:
Error: Property 'data' cannot be accessed on 'Datagram?' because it is potentially null.
- 'Datagram' is from 'dart:io'.
Try accessing using ?. instead.
String s = new String.fromCharCodes(datagram.data);
^^^^
但是,如果我这样做 String s = new String.fromCharCodes(datagram?.data);
,我会收到以下错误:
Error: The argument type 'Uint8List?' can't be assigned to the parameter type 'Iterable<int>' because 'Uint8List?' is nullable and 'Iterable<int>' isn't.
- 'Uint8List' is from 'dart:typed_data'.
- 'Iterable' is from 'dart:core'.
String s = new String.fromCharCodes(datagram?.data);
^
如何正确访问数据报的数据属性?
如果 left-hand-side 为 null
,条件成员访问 运算符 (?.
) 的计算结果为 null
。它的重点是通过尝试访问 null
.
上的 non-existent 成员来避免生成 null-pointer 异常
使用 String.fromCharCodes(datagram?.data)
不会神奇地避免调用 String.fromCharCodes
构造函数,并且 String.fromCharCodes
需要一个 non-null 参数。
您要么必须给 String.fromCharCodes
一个您保证不是 null
的值,要么必须避免调用它。示例:
// If datagram?.data is null, fall back to using an empty string.
var s = String.fromCharCodes(datagram?.data ?? '');
或:
var data = datagram?.data;
if (data != null) {
var s = String.fromCharCodes(data);
...
}
如果您还没有阅读 Understanding null safety,我强烈建议您阅读。
请注意,?.
和 ??
是 null-aware 运算符,但实际上与 null-safety 无关。 Null-safety 是关于使用类型系统来确保变量不会 null
而你不希望它们是
我正在尝试学习 Dart,但我真的很难理解 Null Safety。我有下面的函数,我直接从开发示例 (https://pub.dev/packages/udp) 中复制了它,并稍微调整了我的代码。
void udpConnection(port) async {
var sender = await UDP.bind(Endpoint.any(port: Port(65000)));
var dataLength = await sender.send('Hello World!'.codeUnits, Endpoint.broadcast(port: Port(port)));
var receiver = await UDP.bind(Endpoint.loopback(port: Port(65002)));
try {
receiver.asStream(timeout: Duration(seconds: 20)).listen((datagram) {
String s = new String.fromCharCodes(datagram.data);
print(s);
});
} catch(e) {
print(e);
}
// close the UDP instances and their sockets.
sender.close();
receiver.close();
}
但我收到以下错误:
Error: Property 'data' cannot be accessed on 'Datagram?' because it is potentially null.
- 'Datagram' is from 'dart:io'.
Try accessing using ?. instead.
String s = new String.fromCharCodes(datagram.data);
^^^^
但是,如果我这样做 String s = new String.fromCharCodes(datagram?.data);
,我会收到以下错误:
Error: The argument type 'Uint8List?' can't be assigned to the parameter type 'Iterable<int>' because 'Uint8List?' is nullable and 'Iterable<int>' isn't.
- 'Uint8List' is from 'dart:typed_data'.
- 'Iterable' is from 'dart:core'.
String s = new String.fromCharCodes(datagram?.data);
^
如何正确访问数据报的数据属性?
如果 left-hand-side 为 null
,条件成员访问 运算符 (?.
) 的计算结果为 null
。它的重点是通过尝试访问 null
.
使用 String.fromCharCodes(datagram?.data)
不会神奇地避免调用 String.fromCharCodes
构造函数,并且 String.fromCharCodes
需要一个 non-null 参数。
您要么必须给 String.fromCharCodes
一个您保证不是 null
的值,要么必须避免调用它。示例:
// If datagram?.data is null, fall back to using an empty string.
var s = String.fromCharCodes(datagram?.data ?? '');
或:
var data = datagram?.data;
if (data != null) {
var s = String.fromCharCodes(data);
...
}
如果您还没有阅读 Understanding null safety,我强烈建议您阅读。
请注意,?.
和 ??
是 null-aware 运算符,但实际上与 null-safety 无关。 Null-safety 是关于使用类型系统来确保变量不会 null
而你不希望它们是