Skip to content

Commit 098f3c8

Browse files
authored
Merge pull request #40 from emanuel-braz/feature/webview_flutter
Add GenericMicroAppEventController in order to enable webview controllers
2 parents 0e467f2 + 2bdc7d5 commit 098f3c8

File tree

18 files changed

+336
-36
lines changed

18 files changed

+336
-36
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
## 0.10.0
2+
[2022-07-21]
3+
4+
#### Added
5+
- Add GenericMicroAppEventController in order to enable webview controllers
6+
17
## 0.9.0
28
[2022-07-10]
39

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -589,6 +589,9 @@ or
589589
MicroBoard().showBoard();
590590
```
591591

592+
### 🌐 Micro Web (Webview Controllers)
593+
Take a look at https://pub.dev/packages/fma_webview_flutter
594+
592595

593596
### 📎 The following table shows how Dart values are received on the platform side and vice versa
594597

example/app2/pubspec.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ packages:
4949
name: dart_log
5050
url: "https://pub.dartlang.org"
5151
source: hosted
52-
version: "1.1.1"
52+
version: "1.2.0"
5353
equatable:
5454
dependency: transitive
5555
description:

example/example_host/android/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
buildscript {
2-
ext.kotlin_version = '1.3.50'
2+
ext.kotlin_version = '1.6.10'
33
repositories {
44
google()
55
mavenCentral()

example/example_host/lib/pages/material_app_page_initial.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,10 @@ class _MaterialAppPageInitialState extends State<MaterialAppPageInitial>
2121
@override
2222
void initState() {
2323
registerEventHandler<String>(MicroAppEventHandler<String>((event) {
24+
String? message = event.cast();
2425
ScaffoldMessenger.of(context).removeCurrentSnackBar();
2526
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
26-
content: Text(event.cast()),
27+
content: Text(message ?? 'Unknown'),
2728
));
2829
event.resultSuccess(true);
2930
}, channels: const ['show_snackbar'], distinct: false));

example/example_host/pubspec.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ packages:
5656
name: dart_log
5757
url: "https://pub.dartlang.org"
5858
source: hosted
59-
version: "1.1.1"
59+
version: "1.2.0"
6060
equatable:
6161
dependency: transitive
6262
description:

example/example_routes/pubspec.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ packages:
4949
name: dart_log
5050
url: "https://pub.dartlang.org"
5151
source: hosted
52-
version: "1.1.1"
52+
version: "1.2.0"
5353
equatable:
5454
dependency: transitive
5555
description:

lib/flutter_micro_app.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
library flutter_micro_app;
22

3+
export 'src/controllers/app_event/generic_micro_app_event_controller.dart';
34
export 'src/controllers/app_event/micro_app_event_controller.dart';
45
export 'src/controllers/navigators/navigator_controller.dart';
56
export 'src/controllers/navigators/navigator_event_controller.dart';
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import 'package:flutter/foundation.dart';
2+
3+
import '../../../flutter_micro_app.dart';
4+
5+
abstract class GenericMicroAppEventController {
6+
/// methodChannel
7+
final String? methodChannel;
8+
9+
/// name
10+
String? name;
11+
12+
/// description
13+
String? description;
14+
15+
/// parentName
16+
String? parentName;
17+
18+
late final MicroAppEventController _microAppEventController;
19+
GenericMicroAppEventController(
20+
{this.methodChannel, MicroAppEventController? eventController})
21+
: _microAppEventController =
22+
eventController ?? MicroAppEventController.instance;
23+
24+
/// When recieve event
25+
@mustCallSuper
26+
void onEvent(MicroAppEvent? event) {
27+
if (event != null) _microAppEventController.emit(event);
28+
}
29+
30+
/// emit events
31+
Future<Object?> emit(Object event, {Duration? timeout});
32+
33+
/// dispose controller
34+
void dispose();
35+
}

lib/src/controllers/app_event/micro_app_event_controller.dart

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import 'dart:async';
33

44
import 'package:flutter/foundation.dart';
55
import 'package:flutter/services.dart';
6+
import 'package:flutter_micro_app/dependencies.dart';
67
import 'package:flutter_micro_app/flutter_micro_app.dart';
78
import '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

Comments
 (0)