ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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를 사용해야 한다.

     

    댓글

Designed by Tistory.