Mobile/Flutter

WebApp 만들기(ReactJS - Flutter) - webview_flutter 사용

tranzal 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를 사용해야 한다.