Flutter 기반 크로스 플랫폼 웹 개발

Flutter 웹 개발에서 index.html과 main.dart의 역할과 실행 순서

atomicdev 2024. 10. 31. 15:41
728x90

Flutter 웹 개발에서 index.html과 main.dart의 역할과 실행 순서

Flutter 웹 프로젝트에서 index.html과 main.dart 파일은 웹 애플리케이션의 기본 구조와 핵심 로직을 정의하는 중요한 역할을 합니다. 이 두 파일의 관계와 실행 순서를 이해하면 Flutter 웹 프로젝트가 어떻게 작동하는지 쉽게 파악할 수 있습니다.


1. index.html의 역할

Flutter 프로젝트의 index.html 파일은 웹 애플리케이션의 진입점 역할을 합니다. Flutter 웹 앱을 브라우저에서 실행할 때, /web/index.html 파일이 가장 먼저 로드되며, 다음과 같은 기능을 수행합니다.

  • HTML 구조 제공:
    • index.html은 기본적인 HTML 구조를 정의하며, Flutter가 동작할 환경을 제공합니다.
    • <div id="custom-html-content" class="container mt-5">는 Flutter 외부에서 표시되는 HTML 콘텐츠를 구성합니다.
    • HTML에서 정의된 구조는 Flutter와 별도로 로드됩니다.
  • 외부 리소스 로드:
    • 로 Bootstrap CSS를 추가해 외부 스타일을 로드합니다.
    • 외부 스타일과 스크립트는 Flutter 앱의 UI와 상호작용하지 않고 독립적으로 동작합니다.
  • Flutter 엔트리포인트 설정:
    • 아래 스크립트는 Flutter 엔진을 초기화하고 main.dart를 실행합니다.
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Flutter Web Integration</title>
  <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
  <!-- HTML Content -->
  <section class="container mt-5">
    <h2>HTML SECTION</h2>
    <p>This content is rendered directly from index.html</p>
    <button id="load-flutter-btn" class="btn btn-primary">Load Flutter</button>
  </section>

  <script>
    // JavaScript to handle button click and load Flutter
    document.getElementById('load-flutter-btn').addEventListener('click', function () {
      // Flutter 엔진 로드
      _flutter.loader.loadEntrypoint({
        entrypoint: "main.dart.js",
        onError: function(e) { console.error("Load failed", e); },
      }).then(function(engineInitializer) {
        return engineInitializer.initializeEngine();
      }).then(function(appRunner) {
        return appRunner.runApp();
      });

      // HTML 콘텐츠 숨기기
      document.querySelector('section').style.display = 'none';
    });
  </script>
  <script src="flutter.js"></script> <!-- Flutter 엔진 로드 -->
</body>
</html>

2. main.dart의 역할

  • 앱 초기화:
    • void main() 함수는 Flutter 앱의 시작점입니다.
    • runApp(const MyApp())는 Flutter UI의 최상위 위젯(MyApp)을 화면에 렌더링합니다.
  • UI 구성:
    • MaterialApp과 Scaffold는 Flutter 앱의 전체적인 레이아웃과 구조를 정의합니다.
    • HtmlElementView는 index.html의 특정 HTML 요소(custom-html-content)를 Flutter UI에 통합합니다.

 

import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Flutter and HTML Integration'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: const <Widget>[
              Text(
                'This content is rendered by Flutter.',
                style: TextStyle(fontSize: 20),
              ),
            ],
          ),
        ),
      ),
    );
  }
}



코드 동작 설명

  1. index.html에서 초기 상태:
    • 브라우저가 index.html 파일을 로드합니다.
    • HTML SECTION, This content is rendered directly from index.html, 그리고 Load Flutter 버튼이 화면에 표시됩니다.
  2. 버튼 클릭 시 동작:
    • id="load-flutter-btn" 버튼을 클릭하면 JavaScript 이벤트 리스너가 실행됩니다.
    • _flutter.loader.loadEntrypoint()를 호출하여 Flutter 엔진을 로드하고, main.dart 파일을 실행합니다.
    • 버튼 클릭 이후, section 요소를 숨기기 위해 style.display = 'none'을 사용합니다.
  3. Flutter UI 로드:
    • Flutter의 main.dart 파일에서 정의한 UI가 표시됩니다.
    • Flutter and HTML IntegrationThis content is rendered by Flutter. 문구가 나타납니다.

 


3. 실행 순서

  1. index.html 로드:
    • 웹 브라우저는 index.html을 가장 먼저 로드하고 HTML 구조를 렌더링합니다.
    • 외부 리소스(Bootstrap CSS 등)를 로드하고 Flutter 실행 환경을 준비합니다.
  2. main.dart 실행:
    • index.html의 스크립트가 Flutter 엔트리포인트(main.dart.js)를 로드합니다.
    • Flutter가 실행되면서 main.dart에서 정의된 UI가 브라우저에 렌더링됩니다.
  3. Flutter와 HTML 통합:
    • HtmlElementView(viewType: 'custom-html-content')는 index.html의 특정 HTML 요소를 Flutter UI에 포함합니다.
    • Flutter와 HTML 콘텐츠가 한 화면에서 통합됩니다.

index.html 과 main.dart 파일의 관계와 실행 순서\


결론

이 코드는 설명에서 제시된 index.html의 HTML 구조 제공 및 외부 리소스 로드 역할main.dart의 UI 구성 및 앱 초기화 역할을 실제로 구현한 사례입니다. 실행 순서와 역할이 명확하게 구분되며, Flutter 웹 프로젝트의 구조와 동작 원리를 학습하는 데 적합한 예제입니다.

 

728x90