Flutter

[Flutter] 콜백함수와 웹뷰 위젯, 웹뷰 컨트롤러

jungha_k 2023. 6. 9. 11:22

* 콜백함수?

: 일정 작업이 완료되면 실행되는 함수

(바로 실행되지 않고 특정 조건이 성립될 경우에 실행됨)

 

ex) 웹뷰에서 페이지 로딩이 완료된 뒤에 실행되는 함수 등

 

 

* 웹뷰 위젯

: 프레임워크에 내장된 브라우저를 앱의 네이티브 컴포넌트에 임베딩 하는 것!

= 앱에서 웹브라우저 기능 구현하기

 

네이티브 컴포넌트에 비해 속도가 느리고, 애니메이션 부자연스럽지만

기존 웹사이트 손쉽게 활용 가능하다

 

 

* WebView 위젯 속성

속성 설명
initialUrl 웹뷰에서 처음 실행할 웹사이트를 String 값으로 제공
웹뷰 포함된 위젯이 화면에 생성되면 웹뷰도 생성, initialUrl에 제공된 사이트가 처음으로 실행됨
javascriptMode 웹뷰에서 자바스크립트 실행 허용할지 여부 결정 가능
* JavascriptMode.unrestricted : 제한 없이 실행 가능
* JavascriptMode.disabled : 실행할 수 없음
onWebViewCreated 웹뷰 위젯이 생성되면 실행할 콜백 함수
매개변수 - WebViewController → 뒤로가기, 앞으로가기, ... 
onPageStarted 웹뷰가 처음 생성되거나, 페이지 이동했을때 웹페이지 로딩되기 시작하면 실행할 콜백함수 
함수 매개변수 - 로딩 시작된 페이지의 URL이 String형으로 제공
onPageFinished 웹페이지 로딩 끝나면 실행됨 
로딩 완료된 웹페이지 URL이 String으로 제공
onProgress 웹페이지 로딩 중일때 지속적으로 실행
페이지 로딩 끝날 때까지 실행됨
매개변수 : int 값 (페이지 로딩상태 0 ~ 100)

 


* 다트 코드 외 사용하는 환경 파일

파일명 설명
pubspec.yaml 프로젝트 설정을 변경할 때 사용
android/app/src/main/AndroidManifest.xml 안드로이드 시스템 - 앱 코드 실행 전에 필수로 확보해야 하는 앱에 대한 정보
(앱 권한 등)
android/build.gradle 안드로이드 사용 gradle 설정 파일 (*최상단의 build.gradle은 프로젝트 단 설정)
android/app/build.gradle 안드로이드 사용 gradle 설정 파일, 앱 모듈 관련 설정
ios/Runner/Info.plist iOS앱의 실행 패키지에 관한 필수 설정 정보
XML 구조, 앱에서 사용할 권한 추가시 사용

 


import 'package:flutter/material.dart';
//웹뷰 플러그인
import 'package:webview_flutter/webview_flutter.dart';

class HomeScreen extends StatelessWidget {
  const HomeScreen({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          backgroundColor: Colors.orange,
          title: Text('Code Factory'),
          centerTitle: true,
        ),
        //웹뷰 관련
        body: WebView(
          initialUrl: 'https://blog.codefactory.ai',
          javascriptMode: JavascriptMode.unrestricted,
        ));
  }
}

 

 

* 웹뷰 컨트롤러 :

웹뷰를 제어할 때 사용

...생략

actions: [ //아이콘 버튼으로 유저의 클릭 입력 받는 콜백 함수 실행 가능
            IconButton(
              onPressed: () {
                if (controller != null) {
                  controller!.loadUrl('https://blog.codefactory.ai');
                }
              },
              
... 생략 ...

body: WebView(
          onWebViewCreated: (WebViewController controller) {
            this.controller = controller;
          },
          initialUrl: 'https://blog.codefactory.ai',
          javascriptMode: JavascriptMode.unrestricted,
        ));
  }
}