Back to home

Flutter で flutter_webview 4系 を使った  Flutter のネイティブ と js のやり取り

2 min read
Table of Contents
[webview-flutter] [Android] In release build onPageStarted and onPageFinished are not called when loading a page · Issue #118876 · flutter/flutter
github.com
image

この記事は Flutter の WebView の記事を記載します。

お仕事で Android のWebViewを使った ネイティブ( java or kotlint) と JS をやり取りするコードを書いています。

色々と考えないと作らなければ行けないのでとても大変です。

このコードを書いているときに Flutter ではどうやってやるのではと疑問がでたので調べてみました。

Flutter × WebView

対象プラットフォーム

Flutterは、すでにご存知だと思いますがクロスプラットフォームです。

ひとつのコードでAndroidもiOSもかけてしまいます。

今回は Android を対象にとしました。

やること

WebViewを使って Flutter と JavaScript の双方向でメッセージができることをこの記事でやります。

環境

  • Flutter

    • 3.3.1
  • WebView

コード

コード全体

Githubにあげています。

github.com
github.com

WebView関連は src/lib/webviewApp.dart にまとめています。

デモ

Github の README 参照。

github.com
github.com

ポイント

ネットを見るとおなじライブラリで実装しているものがありますが、4系からかなりの変更があったらしく、ほとんどの記事が使い物になりませんでした。

私が実装してみたときのポイントを書いておきます。

JS から Flutterの関数を呼び出せるようにする

以下のように定義すると window.flutterApp で呼べる。

await webViewController
  .addJavaScriptChannel('flutterApp', onMessageReceived: jsMessageRecv);

Flutter から JS の関数を呼ぶ

以下のように定義すると、JS の関数にコールバックできる。 ※ JS に呼び出す関数を定義しないとエラーになる。

引数を渡すときはシングルクォーテーションで囲ってあげないと渡すことができないので注意。

await _controller
  .runJavaScriptReturningResult("flutterMessage('${result.message}')");

Flutter からの引数をJSで受け取るときの注意

Flutter からのメッセージを受けとった時に、JS側で .toString() をしてStringに変換する必要がある。

これをしないと、エラーになる。

constflutterMessage = (message) => {
  console.log(`recv message: ${message}`);

  // toString() しないとなぜか value に入らずにエラーになる
  recvTextareaElement.value = message.toString();
}

WebView デバッグ

webview controller で プラットフォームの分岐をして、 Android であれば Android特有のデバッグ許可コードを書く。

// android debug
if (webViewController.platformisAndroidWebViewController) {
  AndroidWebViewController.enableDebugging(true);
}

あとは、 chrome://inspect/ でデバッグできる。

躓いたところ

webview 4.0.2 で使える SDK バージョンが高すぎる

webview_flutter 4.0.2 は現時点において android sdk 32(Android 12) 以上ないとエラーになる。

かなり導入しづらい。

One or more plugins require a higher Android SDK version.
Fix this issue by adding the following to /Users/kana/Desktop/my_flutter_webview_js/src/android/app/build.gradle:
android {
compileSdkVersion 32
...
}

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:checkDebugAarMetadata'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.CheckAarMetadataWorkAction
> One or more issues found when checking AAR metadata values:

Dependency 'androidx.webkit:webkit:1.5.0' requires 'compileSdkVersion' to be set to 32 or higher.
Compilation target for module ':app' is 'android-31'

* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.

* Get more help at https://help.gradle.org

参考文献