receiveBroadcastStream method

Stream receiveBroadcastStream ([dynamic arguments ])

Sets up a broadcast stream for receiving events on this channel.

Returns a broadcast Stream which emits events to listeners as follows:

  • a decoded data event (possibly null) for each successful event received from the platform plugin;
  • an error event containing a PlatformException for each error event received from the platform plugin.

Errors occurring during stream activation or deactivation are reported through the FlutterError facility. Stream activation happens only when stream listener count changes from 0 to 1. Stream deactivation happens only when stream listener count changes from 1 to 0.

Implementation

Stream<dynamic> receiveBroadcastStream([dynamic arguments]) {
  final MethodChannel methodChannel = MethodChannel(name, codec);
  StreamController<dynamic> controller;
  controller = StreamController<dynamic>.broadcast(onListen: () async {
    BinaryMessages.setMessageHandler(name, (ByteData reply) async {
      if (reply == null) {
        controller.close();
      } else {
        try {
          controller.add(codec.decodeEnvelope(reply));
        } on PlatformException catch (e) {
          controller.addError(e);
        }
      }
      return null;
    });
    try {
      await methodChannel.invokeMethod('listen', arguments);
    } catch (exception, stack) {
      FlutterError.reportError(FlutterErrorDetails(
        exception: exception,
        stack: stack,
        library: 'services library',
        context: 'while activating platform stream on channel $name',
      ));
    }
  }, onCancel: () async {
    BinaryMessages.setMessageHandler(name, null);
    try {
      await methodChannel.invokeMethod('cancel', arguments);
    } catch (exception, stack) {
      FlutterError.reportError(FlutterErrorDetails(
        exception: exception,
        stack: stack,
        library: 'services library',
        context: 'while de-activating platform stream on channel $name',
      ));
    }
  });
  return controller.stream;
}