2021. 9. 3. 10:30
Flutter에서 webview_flutter alert 안 보일 때 처리 법(toast로 표시) 개발/Flutter2021. 9. 3. 10:30
반응형
며칠 전, Flutter에서 webview_flutter(https://pub.dev/packages/webview_flutter)로 띄운 소스에서
alert가 보이지 않으니 해결해달라는 요청을 받아 처리하게 되었습니다.
찾아보니 webview_flutter는 alert&confirm을 지원하지 않는다고 합니다.
flutter와 html에서 약속을 해서 새로운 function을 만들고 호출하는 방법도 있지만,
(참조: https://cording-cossk3.tistory.com/103)
저는 html 개발하시는 분과 직접 소통하는 것도 아니고, 최대한 네이티브 소스는 건드리지 않기 위하여
그냥 기존에 있는 alert를 flutter의 toast로 작업하는 방식으로 처리하였습니다.
import 'dart:async';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:toast/toast.dart';
import 'package:webview_flutter/webview_flutter.dart';
class WebviewPage extends StatelessWidget {
WebViewController _webViewController;
@override
void initState() {
if (Platform.isAndroid) WebView.platform = SurfaceAndroidWebView();
}
@override
Widget build(BuildContext context) {
return WebView(
initialUrl: '${yourUrl}',
javascriptMode: JavascriptMode.unrestricted,
javascriptChannels: <JavascriptChannel>{
_alertJavascriptChannel(context),
},
onWebViewCreated: (WebViewController webViewController) {
_webViewController = webViewController;
},
onPageFinished: (url) async {
try {
var javascript = '''
window.alert = function (e){
Alert.postMessage(e);
}
''';
await _webViewController?.evaluateJavascript(javascript);
} catch (_) {}
},
);
}
JavascriptChannel _alertJavascriptChannel(BuildContext context) {
return JavascriptChannel(
name: 'Alert',
onMessageReceived: (JavascriptMessage message) {
Toast.show(message.message, context,
duration: Toast.LENGTH_LONG,
gravity: Toast.CENTER,
backgroundColor: Colors.black38,
backgroundRadius: 5);
});
}
}
이 방법으로 하면 confirm도 처리되긴 합니다.
그런데 confirm이 하나일땐 크게 문제 없겠지만 (위와 같이 confirm을 정의해서 flutter 내에서 dialog 호출해서 처리)
여러 개일때는 confirm마다 기능이 다르다면 결국 html 개발자와 같이 상의해서 개발해야 할 것입니다.
confirm도 처리해야 할 때는 android는 webview_flutter를 2.0.13 버전 이상으로 업 하면 해결됩니다.
ios는 다음 글을 참고하여 처리하여 주세요. (다음 글 : https://risha-lee.tistory.com/42)
참고 출처 : https://github.com/flutter/flutter/issues/30358
반응형
'개발 > Flutter' 카테고리의 다른 글
Flutter에서 TextField의 "붙여넣기" 도구 설명 이름을 한국어로 변경하는 방법 (0) | 2022.01.27 |
---|---|
Flutter에서 new_version으로 업데이트 체크 시 Bad state: No element 오류 해결 (Android) (0) | 2021.12.27 |
webview_flutter로 alert/confirm 띄우기 (iOS) (4) | 2021.11.11 |
webview_flutter로 file upload하기 (Android) (0) | 2021.11.09 |
Flutter에서 카카오톡 채널 추가하기 (9) | 2021.08.12 |