我想向流添加一个空值,但它会显示错误。
当我这样做时:
final StreamController<Car?> streamController = StreamController<Car?>.broadcast();
streamController.add(null)
我会得到
flutter: ┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
flutter: │ #0 _BroadcastStreamController.add (dart:async/broadcast_stream_controller.dart:242:14)
flutter: │ #1 CarService.selectCar (package:app/services/car_service.dart:109:39)
flutter: ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
flutter: │ ⛔ type 'Null' is not a subtype of type 'Car' of 'data'
flutter: └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
这似乎是一个通用类型限制。
我们有办法做到这一点吗?
如果我们不能对流执行此操作,我们可以执行以下操作吗:
class NullCar extends Car {
NullCar();
}
var car = NullCar();
streamController.add(car);
并使条件
car == null
等于真?
您可以使用任何虚拟对象,或者我们将其称为 sentinel 值,即您选择的指示器。你的方法也是对的,但是你放不下
汽车==null检查。
但是我们也可以做的是创建一个通用包装器。
class CarWrapper<T> {
final T data;
final bool isNull;
CarWrapper(this.data) : isNull = false;
CarWrapper.nullValue() : data = null, isNull = true;
}
我们稍后可以通过汽车吗?作为通用。
final StreamController<CarWrapper<Car?>>() streamController = StreamController<CarWrapper<Car?>>().broadcast();
在此处添加一个空值,以便包装器的构造函数知道。
streamController.add(CarWrapper(null));
// 添加空值
稍后我们可以这样听。
streamController.stream.listen((data) {
if (data.isNull) {
print("Received a null value.");
} else {
print("Received data: ${data.data}");
}
});
最后我发现我在创建streamController时犯了一个错误。
而不是
final StreamController<Car?> streamController = StreamController<Car?>.broadcast();
我错过了打字
final StreamController<Car?> streamController = StreamController<Car>.broadcast();
将不可为空的实例分配给可为空的变量是合法的。
所以我的IDE认为streamController接受null,但事实并非如此。