WebAdvertisementReceivedEvent.withMemory constructor

WebAdvertisementReceivedEvent.withMemory(
  1. WebAdvertisementReceivedEvent memory,
  2. WebAdvertisementReceivedEvent newEvent
)

Not every device sends all the fields in each advertisement packet. (probably has something to do with the maximum size of such a packet).

This however makes it more difficult for the developer to keep track of the most up-to-date data. This factory creates a new instance of the event but fills in the missing data from newEvent with the information that was stored form the last event that is in memory.

Below in an example how you could implement this memorization.

WebAdvertisementReceivedEvent? memory;

stream.map((event) {
  final convertedEvent =
            WebAdvertisementReceivedEvent.fromJSObject(event, device);

  var combined = convertedEvent;
  if (memory != null) {
    combined = WebAdvertisementReceivedEvent.withMemory(memory!, convertedEvent);
  }
  memory = combined;
  return combined;
});

Implementation

factory WebAdvertisementReceivedEvent.withMemory(
    final WebAdvertisementReceivedEvent memory,
    final WebAdvertisementReceivedEvent newEvent) {
  assert(memory.device == newEvent.device,
      "The device from memory should be the same as from the new event");

  final List<String> uuids = newEvent.uuids;
  final UnmodifiableMapView<int, ByteData> manufacturerData =
      newEvent.manufacturerData;
  final UnmodifiableMapView<String, ByteData> serviceData =
      newEvent.serviceData;

  late String? name;
  if (newEvent.name != null) {
    name = newEvent.name;
  } else {
    name = memory.name;
  }

  final int? rssi = newEvent.rssi;
  final int? txPower = newEvent.txPower;

  late int? appearance;
  if (newEvent.appearance != null) {
    appearance = newEvent.appearance;
  } else {
    appearance = memory.appearance;
  }

  return WebAdvertisementReceivedEvent._(
      uuids: uuids,
      manufacturerData: manufacturerData,
      serviceData: serviceData,
      name: name,
      rssi: rssi,
      txPower: txPower,
      appearance: appearance,
      device: newEvent.device);
}