Flutter InAppWebViewでtarget="_blank", window.openを制御する
はじめに
スマホアプリ内でWebページを表示するときに、WebViewを使用すると思います。
Webページの中には、target="_blank"
やwindow.open
で新しいタブで開くようにしているものがあります。
iOSやAndroidのWebViewではそれぞれ対応が必要ですが、FlutterのInAppWebViewではどのようなことができるか調査しました。
環境
- Flutter 3.10.5
- flutter_inappwebview 5.7.2+3
- url_launcher 6.1.11
サンプルコード
InAppWebViewでtarget="_blank" window.openを制御
InAppWebViewでtarget="_blank"
やwindow.open
を検知・制御するには、onCreateWindow propertyを指定することで可能になります。
Androidの場合、AndroidInAppWebViewOptions
のsupportMultipleWindows propertyをtrue
にする必要があります。
onCreateWindowを指定しなかった場合の挙動
onCreateWindow
を指定しなかった場合、iOS/Androidともに現在表示しているWebViewで開く挙動になっていました。
まったく反応しないわけではないので、大きな問題にはならないように思われます。
ただ、target="_blank"
やwindow.open
を指定したことを考えると、現在のWebViewのページはそのままで、新しくWebページを開いてほしいかもしれません。
onCreateWindowを指定し、外部ブラウザで新しくWebページを開く
onCreateWindow
を指定することで、target="_blank"
やwindow.open
を検知・制御することができます。
そこで、WebViewではなく外部ブラウザで新しくWebページを開いてみました。
InAppWebView(
// ...省略...
onCreateWindow: (controller, createWindowRequest) async {
debugPrint(
'onCreateWindow: ${createWindowRequest.request.url}');
if (createWindowRequest.request.url != null) {
var url = createWindowRequest.request.url!;
if (await canLaunchUrl(url)) {
await launchUrl(url,
mode: LaunchMode.externalApplication);
return true;
}
}
},
// ...省略...
)
-
createWindowRequest.request.url
が新しく開こうとしているWebページのURL - url_launcherの
launchUrl
で外部ブラウザを起動 - WebViewで遷移しないようにするため、
return true
まとめ
Flutter InAppWebViewでtarget="_blank"
, window.open
を制御することができました。
FlutterでWebページを表示していて、target="_blank"
, window.open
が思っていた挙動と異なる場合は、こちらの内容を確認してみるよいと思いました。
Discussion