はじめに
最近で新規アプリ開発と言えば、flutterも有力な選定になるのでは無いでしょうか?
特にスタートアップなどスピードが求めれる場合には強力な武器になると思います。
また、それぞれのネイティブコードを使用すれば、アプリの管理コストがかかる為、flutterに置き換えたり、アプリ自体を閉じる企業もあるそうです。
かく言う自分も今回flutterでアプリ開発をしました。
webでアプリ自体はすでに資産として完成したので、それらを用いるために、webviewを採用しました。
今回はメインとしてwebview_flutterと言うgoogle公式プラグインについて言及します。
ですが、ここに大きな罠がありました。。
ここから自身の考察を述べますがあくまで一意見として呼んで下さい。
TL;DR
flutter + webview はやめとけ
flutterでwebviewってどこまで開発進んでるの?
flutter + webviewを採用するに辺り、公式の開発がどこまで進んでるかですが、結論から言うと
「webviewがメインコンテンツの場合だと使い物にならない」
です。
メインコンテンツの場合と言っていますが、例えば「利用規約や会社概要をwebviewにしたい」程度であれば問題はありません。
しかし、メインコンテンツ(cmd系のユーザーからのアクションがある物)では向いていないと言い切れます。
ネイティブのwebviewで開かれない
まず多くのバグの原因にもなっている「ネイティブのwebviewで開かれない」ですが。
swfitやkotlinでwebveiwクラスを使用するとsafari,chromeで開かれます。
つまり、ブラウザに近しい環境で開く事が出来ます。
これがflutterでは利用する事が出来ません。
なので弊害としてまだ数多くのバグが存在しています。
公式のレポジトリには多くのissueが報告されています。
となると当然iosとandroidで異なる挙動をしやがります。。
公式プラグインがバグだらけ
パフォーマンスも悪い、機能も少なすぎる、言いたい事は多いですが、特に困ったのがios側で権限を求めるダイアログとwebveiw_flutterを組み合わせると、WebViewクラスのbuildが呼ばれない事です。
厳密にはbuildが呼ばれないと言うよりWebViewクラスのライフサイクルで最初に呼ばれるonWebviewCreated()があるのですが、ここでコールバック関数を呼ぶことでwebviewを制御するコントローラを手に入れる事が出来ます。
しかし、これが呼ばれないのでリカバリする方法が無いのでブランク画面になってしまいます。
自分はここだけflutter_webview_pluginを使用する事で回避しました。
Cookie, LocalStorage
cookieの問題はいくつかあります。
容量、set, getがデフォルトで出来ない、持続されない。
localstorageはメインで使用してないのですが、恐らく無いです。。
ここから各プラグインのデメについて言及します。
webview_flutter
- iosでcookieが維持されない
- iosでpermissionを求めるダイアログと組み合わせるとブランクページになる
flutter_webview_plugin
- webviewを操作するコントローラがシングルトンなのでマルチプルなユースケースに使えない
- widget treeに統合されていない為、画面の領域の最大を使用する(z-indexが最大)
flutter_inappwebview
- 個人の開発で不安(ただ割と機能豊富で一番使える)