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 而你不希望它们是