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 안에 담아서 처리한다.
'flutter' 카테고리의 다른 글
flutter 앱 개발 소스 분석-3 (0) | 2024.12.12 |
---|---|
flutter 앱 개발 소스 분석-2 (0) | 2024.12.11 |
windows에서 안드로이드 개발을 위해 사용했던 flutter 프로젝트가 macOS의 ios 에뮬레이터에서 동작을 안할 때 (0) | 2024.12.08 |
flutter build appbundle 오류 (0) | 2024.11.26 |
flutter 1일차 (0) | 2024.11.24 |