본문 바로가기
프로그래밍/Flutter-Dart

[Flutter] WebView JS 통신

by 채연2 2021. 3. 19.

오늘은 웹과 앱에서의 JS통신을 구현해봤다.

html과 javascript까지 봐야하니까.... 너무 어렵다................... 하지만 그래도 해야하기에 (T^T)

 

 

 

html 파일 작성

<!DOCTYPE html>
<html>
<head><title>Navigation Delegate Example</title>
<script>
   function changeColor() {
      var colors = ["black", "red", "green"];
      var randonNumber = Math.floor(Math.random() * 3);
      var myDiv = document.getElementById("container_box");
      myDiv.style.backgroundColor = colors[randonNumber];
      try { colorChanged.postMessage(colors[randonNumber]); } catch (err) {}
   }

   function webToApp(msg) {
      alert(msg);
      try { webToAppChange.postMessage(msg); } catch (err) {}
   }

   function appToWeb(color) {
      alert("aa");
      var myDiv = document.getElementById("container_box");
      myDiv.style.backgroundColor = color;
   }
</script>
<style type="text/css">
   #btn_color {
            display: block;
      margin: auto;
   }
   #container_box {
      height: 200px;
      width: 400px;
      border: 1px solid #000 ;
      margin: 0 auto;
   }
</style>
</head>
<body>
<p>
    The navigation delegate is set to block navigation to the youtube website.
</p>
<div id="container_box"></div>
</br>
<ul>
    <button id="btn_webToApp" onclick="webToApp('웹페이지에서 앱 전달')">webToApp</button>
    <button id="btn_appToWeb" onclick="appToWeb('black')">appToWeb</button>
</ul>
</br>
<ul>
    <ul><a href="https://www.youtube.com/">https://www.youtube.com/</a></ul>
    <ul><a href="https://www.google.com/">https://www.google.com/</a></ul>
</ul>
</body>
</html>

여기서 WebToApp function은 alert를 띄워주고, 로그를 뿌려준다.

appToWeb function은 alert를 띄워주고, container_box id를 가진 div의 backgroundcolor를 변경해준다.

 

 

 

320x100

 

 

main.dart에 index.html load하기

void _onNavigationDelegateExample(WebViewController controller, BuildContext context) async {
   String _fileText = await rootBundle.loadString('assets/index.html');
   final String contentBase64 = base64Encode(const Utf8Encoder().convert(_fileText));
   await controller.loadUrl('data:text/html;base64,$contentBase64');
}

다음과 같이 rootBundle.loadString을 사용해서 로드해주면 된다. 이때, async 함수에서 행해져야한다!

 

 

 

javaScriptChannels 등록하기

@override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Flutter WebView example'),
        // This drop down menu demonstrates that Flutter widgets can be shown over the web view.
        actions: <Widget>[
          NavigationControls(_controller.future),
          SampleMenu(_controller.future),
        ],
      ),
      body: Builder(builder: (BuildContext context) {
        return WebView(
          initialUrl: 'https://flutter.dev',
          javascriptMode: JavascriptMode.unrestricted,
          onWebViewCreated: (WebViewController webViewController) {
            _controller.complete(webViewController);
          },
          onProgress: (int progress) {
            print("WebView is loading (progress : $progress%)");
          },
          javascriptChannels: <JavascriptChannel>{
            _webToAppChange(context),
          },
        );
      }),
    );
  }
JavascriptChannel _webToAppChange(BuildContext context) {
   return JavascriptChannel(
      name: 'webToAppChange',
      onMessageReceived: (JavascriptMessage message) {
         // ignore: deprecated_member_use
         print("webToAppChange 메시지 : ${message.message}");
      });
}

위 코드에서는 웹에서 메시지를 받아 로그를 뿌려주는 코드이다.

 

controller.evaluateJavascript('appToWeb("red")');

다음은 javascript를 실행하는 코드이다. index.html의 appToWeb function을 실행시켜준다.

뭐 음 navigation 버튼 만들어서 onPressed시 다음과 같이 작성해 주면 될 것 같다.

IconButton(
   icon: const Icon(Icons.replay),
   onPressed: !webViewReady
      ? null
      : () {
         controller.evaluateJavascript('appToWeb("red")');
   },
)

 

 

끝@@@!!!!!

 

 

 

 

※ ios에서는.. javascript의 alert()가 안먹히는것같다.. 

안드로이드에서는 잘 되는데 ios에서는 안된다! 저거만!

 

 

 

 

참고 : m.blog.naver.com/PostView.nhn?blogId=danyoh&logNo=221772586273&categoryNo=7&proxyReferer=https:%2F%2Fwww.google.com%2F

 

Flutter WebView javascript call

class _MyPagetate extends State { WebViewController _webViewContro...

blog.naver.com

 

 

 

 

320x100

'프로그래밍 > Flutter-Dart' 카테고리의 다른 글

[Flutter] wifi connect 정보  (0) 2021.03.22
[Flutter] Webview JavaScript Handler 등록  (0) 2021.03.22
[Flutter] IOS 앱 구동 (2)  (0) 2021.03.19
[Flutter] IOS 앱 구동 (1)  (0) 2021.03.19
[Flutter] Flutter http  (0) 2021.03.18

댓글