createBaseWebViewController function
WebViewController
createBaseWebViewController(
- void bridgeMessagesHandler(
- JavaScriptMessage
Implementation
WebViewController createBaseWebViewController(
void Function(JavaScriptMessage) bridgeMessagesHandler,
) {
late final PlatformWebViewControllerCreationParams params;
if (WebViewPlatform.instance is WebKitWebViewPlatform) {
params = WebKitWebViewControllerCreationParams(
allowsInlineMediaPlayback: true,
mediaTypesRequiringUserAction: const <PlaybackMediaTypes>{},
);
} else {
params = const PlatformWebViewControllerCreationParams();
}
final controller = WebViewController.fromPlatformCreationParams(
params,
onPermissionRequest: (request) async {
final resources = request.platform.types.toList();
if (resources.isEmpty) {
return;
}
final permissions = Platform.isAndroid
? resources
.map((r) {
final permission =
TabbyPermissionResourceType.toAndroidPermission(r);
return permission;
})
.whereType<Permission>()
.toList()
: [Permission.camera, Permission.microphone];
final statuses = await permissions.request();
final isGranted = statuses.values.every((s) => s.isGranted);
final future = isGranted ? request.grant : request.deny;
await future();
},
)
..setBackgroundColor(Colors.transparent)
..setJavaScriptMode(JavaScriptMode.unrestricted)
..addJavaScriptChannel(
TabbySDK.jsBridgeName,
onMessageReceived: (message) {
if (kDebugMode) {
log(
'Got message from JS '
'[${TabbySDK.jsBridgeName}]: '
'${message.message}',
);
}
bridgeMessagesHandler(message);
},
);
if (controller.platform is AndroidWebViewController) {
(controller.platform as AndroidWebViewController)
..setMediaPlaybackRequiresUserGesture(false)
..setOnShowFileSelector(
(params) async {
return _androidFilePicker(params);
},
);
}
return controller;
}