我们可以向 StreamController 添加 null 值吗? (颤动、飞镖)

问题描述 投票:0回答:2

我想向流添加一个空值,但它会显示错误。

当我这样做时:

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
等于真?

flutter dart stream streamcontroller
2个回答
0
投票

您可以使用任何虚拟对象,或者我们将其称为 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}");
        }
      });

0
投票

最后我发现我在创建streamController时犯了一个错误。

而不是

final StreamController<Car?> streamController = StreamController<Car?>.broadcast();

我错过了打字

final StreamController<Car?> streamController = StreamController<Car>.broadcast();

将不可为空的实例分配给可为空的变量是合法的。

所以我的IDE认为streamController接受null,但事实并非如此。

© www.soinside.com 2019 - 2024. All rights reserved.