@@ -3,6 +3,7 @@ import 'dart:async';
33
44import 'package:flutter/foundation.dart' ;
55import 'package:flutter/services.dart' ;
6+ import 'package:flutter_micro_app/dependencies.dart' ;
67import 'package:flutter_micro_app/flutter_micro_app.dart' ;
78import 'package:flutter_micro_app/src/services/native_service.dart' ;
89
@@ -17,6 +18,9 @@ class MicroAppEventController {
1718 StreamController .broadcast ();
1819 late MicroAppNativeService _microAppNativeService;
1920 late MicroAppEventDelegate _handlerRegisterDelegate;
21+ final Map <String , GenericMicroAppEventController > _webviewControllers = {};
22+ Map <String , GenericMicroAppEventController > get webviewControllers =>
23+ _webviewControllers;
2024
2125 /// Used to listen all micro app events
2226 MicroAppEventSubscription get onEvent => _controller.stream.listen;
@@ -45,6 +49,16 @@ class MicroAppEventController {
4549 MicroAppEventAdapter adapter = MicroAppEventJsonAdapter ();
4650 final event = adapter.parse (call);
4751 _controller.add (event);
52+
53+ try {
54+ // It dispatchs event to all webviews
55+ for (var webviewController in _webviewControllers.values) {
56+ webviewController.emit (event);
57+ }
58+ } catch (e) {
59+ logger.e ('An error occurred while dispatching events to webviews' ,
60+ error: e);
61+ }
4862 });
4963 }
5064
@@ -57,6 +71,7 @@ class MicroAppEventController {
5771 List <Future > emit <T >(MicroAppEvent <T > event, {Duration ? timeout}) {
5872 final futures = < Future > [];
5973
74+ // Native mobile events
6075 if (MicroAppPreferences .config.nativeEventsEnabled) {
6176 final nativeFuture = _microAppNativeService.emit (
6277 Constants .methodMicroAppEvent, event.toMap ());
@@ -67,6 +82,13 @@ class MicroAppEventController {
6782 }
6883 }
6984
85+ // Webview events
86+ for (var webviewController in _webviewControllers.values) {
87+ final webFuture = webviewController.emit (event, timeout: timeout);
88+ futures.add (webFuture);
89+ }
90+
91+ // Flutter events
7092 _controller.add (event);
7193 if (timeout == null ) {
7294 futures.add (event.asFuture);
@@ -122,4 +144,22 @@ class MicroAppEventController {
122144 void dispose () {
123145 _controller.close ();
124146 }
147+
148+ /// registerWebviewController
149+ GenericMicroAppEventController registerWebviewController (
150+ {required String id,
151+ required GenericMicroAppEventController controller}) {
152+ return _webviewControllers[id] = controller;
153+ }
154+
155+ /// unregisterWebviewController
156+ GenericMicroAppEventController ? unregisterWebviewController (
157+ {required String id}) {
158+ final controller = _webviewControllers.remove (id);
159+ if (controller != null ) {
160+ controller.dispose ();
161+ return controller;
162+ }
163+ return null ;
164+ }
125165}
0 commit comments