Flutter Hybrid App Integration Guide
There are several plugins you can use for webviews in Flutter. Since different methods are used for different plugins, Airbridge provides a javascript interface to use with the plugins.
Interface
var webInterface = Airbridge.createWebInterface(
webToken: 'YOUR_WEB_TOKEN',
postCommandFunction: (arg) {
return """...""";
});
YOUR_WEB_TOKEN
can be found at the Airbridge dashboard -> Settings -> Tokens -> Web SDK token.
abstract class AirbridgeWebInterface {
String get script;
void handle(String message);
}
The javascript interface can be utilized through the return of AirbridgeWebInterface
.
Use Cases
Below are use cases for two plugins with Airbridge.
webview_flutter Package Link
@override
Widget build(BuildContext context) {
WebViewController controller = WebViewController()
..setJavaScriptMode(JavaScriptMode.unrestricted)
..loadRequest(Uri.parse('YOUR_WEB_URL'));
setJavascriptInterface(controller);
return WebViewWidget(controller: controller);
}
void setJavascriptInterface(WebViewController controller) {
String initChannel = 'INIT_CHANNEL_NAME';
String handleChannel = 'NATIVE_CHANNEL_NAME';
var webInterface = Airbridge.createWebInterface(
webToken: 'YOUR_WEB_TOKEN',
postCommandFunction: (arg) {
return 'window.$handleChannel.postMessage($arg);';
});
controller.addJavaScriptChannel(
initChannel,
onMessageReceived: (message) {
controller.runJavaScript(webInterface.script);
}
);
controller.addJavaScriptChannel(
handleChannel,
onMessageReceived: (message) {
webInterface.handle(message.message);
}
);
}
- web interface 를 생성한다. postCommandFunction 에 app 으로 native channel로 메세지를 보내는 javascript 를 작성한다.
WebViewWidget
초기화 시점 문제로 init channel 을 생성하여 초기화 시점에 callback 을 받도록 한다.- native channel 을 생성한다.
- 초기화 시점에
controller.runJavaScript(webInterface.script);
호출 하여 javascript 를 inject 한다. - native channel 로 도착한 메세지를
webInterface.handle(message.message);
을 통해 native SDK 로 전달한다.
flutter_inappwebview 바로가기
- Create a web interfrace. Use a javascript in
postCommandFunction
that sends a message to the native channel with the app. - To resolve
WebViewWidget
's initialization timing, create an init channel and perform a callback when initialized. - Create a native channel.
- Call
controller.runJavaScript(webInterface.script);
upon initialization and inject the javascript. - Use
webInterface.handle(message.message);
to forward the message received by the native channel to the native SDK.
flutter_inappwebview Package Link
@override
Widget build(BuildContext context) {
webInterface = Airbridge.createWebInterface(
webToken: 'YOUR_WEB_TOKEN',
postCommandFunction: (arg) {
return """window.flutter_inappwebview.callHandler('postMessage', $arg);""";
});
return InAppWebView(
key: webViewKey,
initialUrlRequest: URLRequest(url: Uri.parse("YOUR_WEB_URL")),
onWebViewCreated: (controller) async {
controller.addJavaScriptHandler(handlerName: 'postMessage', callback: (args) {
webInterface.handle(args[0]);
return args;
});
},
initialUserScripts: UnmodifiableListView<UserScript>([
UserScript(
source: webInterface.script,
injectionTime: UserScriptInjectionTime.AT_DOCUMENT_START)
]),
);
}
- Create a web interface. Use a javascript in
postCommandFunction
that sends a message to the native channel with the app. - Register a native javascript handler through
controller.addJavaScriptHandler()
uponInAppWebView
'sonWebViewCreated
. - Forward the message to the native SDK through a
webInterface.handle(message.message);
callback.
To resolveWebViewWidget
's initialization timing, create an init channel and perform a callback when initialized. - Inject
webInterface.script
throughInAppWebView
'sinitialUserScripts
. UseUserScriptInjectionTime.AT_DOCUMENT_START
for the injection time.