import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:html/parser.dart' show parse;
import 'package:webview_flutter/webview_flutter.dart';
import 'package:printing/printing.dart';
import 'package:http/http.dart' as http;
import 'package:google_mobile_ads/google_mobile_ads.dart';

이번 프로젝트에서 사용된 package들.

dart:convert: JSON 인코딩/디코딩 및 Base64 인코딩을 위해 사용. 사용한 부분이 있는지 기억이 잘안난다. 아마 파싱할 때 같이 쓰인 것 같다. 나머지는 뭐... 이름 그대로다.

google_mobile_ads 는 애드몹을 위해서 사용하는 패키지.

http는 http 요청을 보내는 용도, printing은 html내용을 pdf로 변환하기 위한 용도. 

webview_flutter는 웹페이지를 앱 내에서 표시하는 패키지. html/parser는 파싱용. 많이 썼다.

void main(){
  WidgetsFlutterBinding.ensureInitialized();
  MobileAds.instance.initialize();
  runApp(const MyApp());
}

WidgetFlutterBinding.ensureInitialized(): flutter 엔진 초기화.앱을 실행하기 전에 필요한 바인딩을 설정한다. WidgetsFlutterBinding의 인스턴스가 초기화되어있는지 확인한다. 초기화되지 않았다면 새로운 인스턴스를 생성하고 호출한다.

flutter/widgets.dart 또는 flutter/material.dart에 있다고 하다는데 cupertino에서도 쓰는걸 보면 그냥 처음에 이거 없으면 안되는 것 같다. 이유불문 있어야 한다고 생각하자. void Main()이 있어야 하는 이유와 다를 바가 없는 듯.

MobileAds.instance.initialize(): 설명 많이 할 거 없고 구글 애드몹 SDK 초기화 및 인스턴스 초기화.

runApp(const MyApp());

주어진 위젯(MyApp())을 루트 위젯으로 설정하고, 화면에 렌더링한다.  const가 굳이 붙어야 하냐 하면 잘모르겠긴 하다. 불변 객체로 생성하기 위함이라는데 음... 조금 더 확인이 필요해보인다.

어쨌건 이를 통해서 void main()에는 처음 인스턴스 초기화 및 초기 위젯 설정 외에 다른 역할을 하지 않는다는 것을 알 수 있다.

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

  @override
  State<MyApp> createState() => _MyAppState();
}

MyApp을 위젯이라 하는 이유는 StatefulWidget을 상속받기 때문이다. StatefulWidget은 상태를 가질 수 있는 위젯이다. 상태가 변경될 때마다 위젯을 다시 빌드할 수 있어서 동적 UI를 구현하는데 적합하다고 한다. 대부분의 앱들은 사실상 StatefulWidget으로 만들어지지 않을까 싶다. 그럼 StatelessWidget의 장점이 무엇일지 찾아보는 것도 좋아보인다.

const MyApp({super.key}) : MyApp 클래스 생성자. const인 이유는 불변 객체로 생성하여 성능 최적화를 도모하기 위함이라고 한다.

super.key: Flutter에서 위젯을 식별하고 효율적으로 업데이트할 수 있도록 돕는 Key 객체를 설정한다고 한다. 뭔 말인지 잘 모르겠다. 흠..

createState(): _MyAppState 클래스의 새 인스턴스를 생성하여 반환한다. _MyAppState는 MyApp의 상태를 관리하며, 실제로 UI를 빌드하고 상호작용을 처리한다. 

_MyAppState는 State<MyApp>을 상속받아, MyApp 위젯의 상태를 정의하고 관리한다. _MyAppState 내에서 setState()가 발생할 때 위젯을 다시 그린다고 생각하면 되는 것 같다. 그래서 값을 변경하는 경우가 있을 때 보통 setState 안에 담아서 처리한다.

 

+ Recent posts