I'm trying to learn Dart, but I'm having a really hard time wrapping my head around the Null Safety. I have the function below, which I copied straight from the dev example (https://pub.dev/packages/udp) and tweaked for my code just slightly.
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();
}
But I get the following error:
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);
^^^^
However, if I do String s = new String.fromCharCodes(datagram?.data);, I get the following error:
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);
^
How can I access the data property of the Datagram correctly?
The conditional member access operator (
?.) evaluates tonullif the left-hand-side isnull. The point of it is to avoid generating a null-pointer exception by attempting to access a non-existent member onnull.Using
String.fromCharCodes(datagram?.data)would not magically avoid calling theString.fromCharCodesconstructor, andString.fromCharCodesexpects a non-null argument.You either must give
String.fromCharCodesa value that you guarantee is notnullor must avoid calling it. Examples:or:
I strongly recommend reading Understanding null safety if you haven't already done so.
Note that
?.and??are null-aware operators but aren't really about null-safety. Null-safety is about using the type system to ensure that variables cannot benullwhen you don't expect them to be.