パルカワ2

最近はFlutterをやっています

flutter_inappwebviewに関する知見

ほしい機能がなかったからwebview_flutterをやめて、flutter_inappwebviewを使うようにした。 flutter_inappwebviewは機能がモリモリでモリモリすぎるという印象だけど、自分でモリモリ作るよりはいいだろという感じ。ちなみにflutter_inappwebviewはflutter_inappbrowerから名前が変わっている。

pub.dev

いくつか困ったことがあったので書いておく。

AndroidでcallHandlerがないと言われる

[InAppWebview]: window.flutter_inappwebview.callHandler is not a function · Issue #218 · pichillilorenzo/flutter_inappwebview · GitHub

原因はしっかり調べていないけど、AndroidだとcallHandlerがないと言われる。

private APIは使えるので、しょうがないのでそっちを使うようにした。ちなみにiOSではprivate APIのほうがないのでprivate APIの実装だけだとエラーになる。

const message = "value";
if (window.flutter_inappwebview.callHandler) {
  window.flutter_inappwebview.callHandler('handlerName', message);
} else {
  window.flutter_inappwebview._callHandler('handlerName', setTimeout(function(){}), JSON.stringify([message]));
}

iOSで hot restartするとエラーになる

flutter_inappwebview 2.1.0+1 で再現する。 InAppWebViewがremoveFromSuperviewされたタイミングでsetMethodCallHandler(nil)しているのが原因

MissingPluginException: No implementation found for method loadUrl · Issue #209 · pichillilorenzo/flutter_inappwebview · GitHub

現在のmaster branch(9c7ac0d)では、removeFromSuperviewでのsetMethodCallHandler(nil)がなくなっているので再現しない。

iOSで 9c7ac0d を使うとPromiseが使えない

TypeError: Promise._immediateFn is not a function. · Issue #288 · pichillilorenzo/flutter_inappwebview · GitHub

原因はこれ JavaScript - Object definition available before code execution on Safari - Stack Overflow

まとめ

なおしていくぞ