본문 바로가기
IT

[.4] 플러터-Flutter WebView - Progress Indicator 위젯이용 로딩 화면 구현

by SOGNOD 2022. 11. 6.
반응형

Progress Indicator 위젯

웹뷰(WebView)를 통해 홈페이지를 불러올때 시간이 오래 걸리는 경우가 있어요
로딩 시간이 오래 걸릴때 ProgressIndicator 위젯을 통해 시각적으로 사이트정보를
가져오는 중임을 알려주는 기능을 구현 합니다.
※ 해외 사용시 필수 기능입니다.

Flutter Progress Indicator 위젯

LinearProgressIndicator
CircularProgressIndicator

1. WebView 이벤트 처리 Dart 파일 생성

WebView 는 페이지 로드시 3개의 로드 이벤트를 제공 합니다.
- onPageStarted
- onProgress
- onPageFinished

추가로 만들 dart 소스파일을 저장할 폴더 "lib/src" 를 만들어 주고,
WebView 이벤트 처리용 dart  소스파일을 src 폴더 아래에
"lib/src/web_view_stack.dart" 파일을 생성 합니다.

lib/src 폴더 생성
lib/src/web_view_stack.dart 파일 생성

Dart 파일을 만들때는 .dart 확장자를 입력하지 않아도 됩니다.

Dart 파일 생성


web_view_stack.dart 파일에 다음 코드를 등록 합니다.

웹 페이지 호출시 페이지 로드 비율이 100% 미만일 때 Progress Indicator 위젝을 불러와 오버레이 합니다.

import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';

class WebViewStack extends StatefulWidget {
  const WebViewStack({Key? key}) : super(key: key);

  @override
  State<WebViewStack> createState() => _WebViewStackState();
}

class _WebViewStackState extends State<WebViewStack> {
  var loadingPercentage = 0;

  @override
  Widget build(BuildContext context) {
    return Stack(
      children: [
        WebView(
          initialUrl: 'https://flutter.dev',
          onPageStarted: (url) {
            setState(() {
              loadingPercentage = 0;
            });
          },
          onProgress: (progress) {
            setState(() {
              loadingPercentage = progress;
            });
          },
          onPageFinished: (url) {
            setState(() {
              loadingPercentage = 100;
            });
          },
        ),
        if (loadingPercentage < 100)
        	// 페이지 로드 비율이 100% 미만일때 Progress Indicator 위젯 보여주기
          LinearProgressIndicator(
            value: loadingPercentage / 100.0,
          ),
      ],
    );
  }
}


2. main.dart 에서 WebViewStack 부르도록 수정

main.dart 에서 WebView 를 호출했던 부분을
위에서 만든 web_view_stack -> WebViewStack() 을 호출 하도록 변경

import 'package:flutter/material.dart';
import 'src/web_view_stack.dart';  // 추가
// import 'package:webview_flutter/webview_flutter.dart'; // 제거

void main() {
  runApp(
    const MaterialApp(
      home: WebViewApp(),
    ),
  );
}

class WebViewApp extends StatefulWidget {
  const WebViewApp({Key? key}) : super(key: key);

  @override
  State<WebViewApp> createState() => _WebViewAppState();
}

class _WebViewAppState extends State<WebViewApp> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Flutter WebView'),
      ),
      body: const WebViewStack(),
      // WebView 위젯을 새로만든 WebViewStack 으로 교체
    );
  }
}

// AppBar 자동 주석 칭찬해요~ ^^


3. Progress Indicator 실행 테스트

main.dart 파일까지 수정 후 Android AVD 를 실행
run (Shift+F10)

1) LinearProgressIndicator 위젯 예시

if (loadingPercentage < 100)
  LinearProgressIndicator(
    value: loadingPercentage / 100.0,
  ),


2) CircularProgressIndicator 위젯 예시

if (loadingPercentage < 100)
  CircularProgressIndicator(
    value: loadingPercentage / 100.0,
  ),

이건 뭥?? ㅋ

LinearProgressIndicator 승리로~

원 코드는 다음 사이트를 참고 했습니다.
https://codelabs.developers.google.com/

 

Google Codelabs

Google Developers Codelabs provide a guided, tutorial, hands-on coding experience. Most codelabs will step you through the process of building a small application, or adding a new feature to an existing application. They cover a wide range of topics such a

codelabs.developers.google.com

 

반응형