takeMeasurements method

Stream<MiScaleMeasurement> takeMeasurements()

Listens for weight measurements

Provides a stream of MiScaleMeasurement instances. Multiple instances are emitted for the same measurement throughout the progress of the measurement to denote changes. The measurements continue to be taken until the returned stream is cancelled.

Implementation

Stream<MiScaleMeasurement> takeMeasurements() {
  StreamSubscription? dataSubscription;
  StreamSubscription? cleanUpSubscription;
  late StreamController<MiScaleMeasurement> controller;
  controller = StreamController<MiScaleMeasurement>.broadcast(
    onListen: () {
      // Process scale data into measurements
      dataSubscription = readScaleData().listen((scaleData) {
        final measurement = MiScaleMeasurement.processData(
          _activeMeasurements[scaleData.deviceId],
          scaleData,
        );
        if (measurement != null &&
            measurement.stage != MiScaleMeasurementStage.MEASURED) {
          _activeMeasurements[scaleData.deviceId] = measurement;
        } else {
          _activeMeasurements.remove(scaleData.deviceId);
        }
        if (measurement != null) controller.add(measurement);
      });
    },
    onCancel: () {
      dataSubscription?.cancel();
      cleanUpSubscription?.cancel();
      _activeMeasurements.clear();
      controller.close();
    },
  );
  return controller.stream.distinct();
}