-
WebApp 만들기(ReactJS - Flutter) - webview_flutter 사용Mobile/Flutter 2022. 4. 16. 23:58
Flutter를 이용한 WebApp을 만드는 방법을 작성한다.
웹앱을 만들기 위해서는 webview_flutter 패키지가 필요하다.
flutter pub add webview_flutter
위 명령어를 터미널에 입력해 준다.
이제 코드를 작성하면 된다.
예시로는 네이버를 이용하였다.
class _MyHomePageState extends State<MyHomePage> { @override Widget build(BuildContext context) { return const Scaffold( body: WebView( initialUrl: "https://m.naver.com/", ), ); } }
위처럼 만든다면 아래 이미지처럼 앱에 웹 화면은 나타나게 할 수 있다.
웹에서 특정한 변수를 앱으로 넘기기 위해서는 javaScriptChannel을 생성해야 한다.
class _MyHomePageState extends State<MyHomePage> { @override Widget build(BuildContext context) { return Scaffold( body: WebView( initialUrl: "https://m.naver.com/", javascriptChannels: <JavascriptChannel>{ JavascriptChannel( name: "Sample", onMessageReceived: (JavascriptMessage message) { //필요한 처리 내용 작성 } ) }, ), ); } }
하지만 위처럼 만 작성한다면 자바스크립트 코드를 허용하지 않았기 때문에 화면이 정상적으로 출력되지 않을 수 있다.
class _MyHomePageState extends State<MyHomePage> { @override Widget build(BuildContext context) { return Scaffold( body: WebView( initialUrl: "접속할 URL", javascriptMode: JavascriptMode.unrestricted, javascriptChannels: <JavascriptChannel>{ JavascriptChannel( name: "Sample", onMessageReceived: (JavascriptMessage message) { //필요한 처리 내용 작성 } ) }, ), ); } }
위처럼 JavascriptMode를 추가하여 제한을 해제해 준다.
Flutter에는 위처럼 작성 후 웹에 코드를 작성해야 한다.
if(window.Sample && window.Sample.postMessage){ let data = `{"message" : "호출"}` window.Sample.postMessage(data); }
위 방식으로 호출을 하게 되면 Flutter로 데이터를 전달할 수 있다.
window.Sample에서 Sample은 JavascriptChannel의 name 부분을 원하는 이름으로 변경하면 된다.
이제 앱에서 웹으로 자바스크립트를 작동시켜보자
class _MyHomePageState extends State<MyHomePage> { late WebViewController _webViewController; final Completer<WebViewController> _controller = Completer<WebViewController>(); @override Widget build(BuildContext context) { return Scaffold( body: WebView( initialUrl: "http://10.0.2.2:3000/", javascriptMode: JavascriptMode.unrestricted, onWebViewCreated: (WebViewController webViewController) { _controller.complete(webViewController); _webViewController = webViewController; }, javascriptChannels: <JavascriptChannel>{ JavascriptChannel( name: "Sample", onMessageReceived: (JavascriptMessage message) { log(message.message); _webViewController.runJavascriptReturningResult("alert('반환')"); //필요한 처리 내용 작성 } ) }, ), ); } }
위 처럼 코드를 onWebViewCreated로 webViewController를 변수에 저장한 후 webViewController의 runJavascriptReturnResult를 이용하여 웹에서 String으로 작성된 코드를 실행시킬 수 있다.
Completer는 webViewController의 처리를 비동기로 변경하여 처리할 수 있도록 한다.
아래는 해당 방식으로 호출 시 나타나는 화면이다.
하지만 앱에서 웹에 있는 특정 함수를 실행해야 한다면 위의 webview_flutter는 사용하기 어렵다.
만약 웹의 특정 함수를 사용해야 한다면 flutter_inappwebview를 사용해야 한다.
'Mobile > Flutter' 카테고리의 다른 글
Firebase 푸시 메시지(Android) (0) 2022.04.20 flutter_inappwebview를 사용할 시 android에서 키보드 안나오는 현상 (0) 2022.04.19 Firebase 연동(Android) (0) 2022.04.19 Channel을 이용한 변수 전달(Kotlin - flutter) - flutter_inappwebview 사용 (0) 2022.04.17 WebApp 만들기(ReactJS - Flutter) - flutter_inappwebview 사용 (0) 2022.04.17