Flutter 튜토리얼 76편: Widget Previewer와 기타 도구
요약
핵심 요지
- 문제 정의: Flutter 개발 시 위젯을 미리보거나 속성을 편집하고, 코드를 정리하는 작업이 반복적으로 필요하다.
- 핵심 주장: Flutter는
Widget Previewer1,Property Editor2,Flutter Fix3 등 생산성 도구를 제공한다. - 주요 근거: 이 도구들을 활용하면 전체 앱을 실행하지 않고도 위젯을 확인하고, deprecated API를 자동 수정할 수 있다.
- 실무 기준: VS Code나 Android Studio에서 IDE 통합 기능을 활용하면 가장 효율적이다.
- 한계: Widget Previewer는 실험적 기능이며, 네이티브 플러그인이나 dart
의존성이 있으면 제한된다.
문서가 설명하는 범위
- Widget Previewer로 위젯 미리보기
- Property Editor로 속성 편집하기
- Flutter Fix로 deprecated API 자동 수정
- 코드 포맷팅 도구 사용법
- Hot Reload 동작 원리와 제한 사항
읽는 시간: 18분 | 난이도: 초급
참고 자료
- Flutter Widget Previewer - 위젯 미리보기 도구
- Flutter Property Editor - 속성 편집기
- Automated fixes - 자동 수정 도구
- Code formatting - 코드 포맷팅
- Hot reload - 핫 리로드
문제 상황
Flutter 앱을 개발하다 보면 여러 반복 작업이 발생합니다. 위젯이 어떻게 보이는지 확인하려면 앱 전체를 실행해야 하고, 속성을 바꾸려면 코드를 직접 수정해야 합니다.
개발 생산성의 병목
위젯 확인 → 앱 전체 실행 → 해당 화면까지 네비게이션속성 변경 → 코드 수정 → 저장 → 리로드 → 확인deprecated API → 문서 확인 → 수동 수정문제는 다음과 같습니다.
- 간단한 UI 변경에도 앱 전체를 실행해야 합니다.
- Flutter 버전이 올라가면서 deprecated된 API를 일일이 찾아 수정해야 합니다.
- 코드 스타일이 일관되지 않으면 리뷰 시간이 늘어납니다.
해결 방법
Flutter는 개발 생산성을 높이기 위한 여러 도구를 제공합니다. Widget Previewer, Property Editor, Flutter Fix, 코드 포맷터를 활용하면 반복 작업을 줄일 수 있습니다.
챕터 1: Widget Previewer로 위젯 미리보기
Why
NOTE전체 앱을 실행하지 않고 개별 위젯만 확인할 수 있다면 어떨까요? Widget Previewer는 Chrome 브라우저에서 위젯을 실시간으로 렌더링합니다.
디자인 시스템이나 재사용 컴포넌트를 만들 때 특히 유용합니다. 앱의 특정 화면까지 네비게이션할 필요 없이 바로 위젯을 확인할 수 있습니다.
What
NOTEWidget Previewer는
@Preview어노테이션을 사용해서 위젯을 미리봅니다. Flutter 3.35 이상에서 사용할 수 있으며, IDE 지원은 Flutter 3.38 이상이 필요합니다.현재는 실험적 기능이며 API가 변경될 수 있습니다.
How
TIP@Preview 어노테이션 사용하기
import 'package:flutter/widget_previews.dart';import 'package:flutter/material.dart';@Preview(name: 'My Sample Text')Widget mySampleText() {return const Text('Hello, World!');}IDE에서 열기
IDE 방법 VS Code 사이드바에서 “Flutter Widget Preview” 탭 열기 Android Studio 사이드바에서 “Flutter Widget Preview” 탭 열기 커맨드라인에서 실행하기
Terminal window flutter widget-preview startPreview 커스터마이징
@Preview(name: 'Button - Light',group: 'Buttons',brightness: Brightness.light,size: Size(200, 100),)Widget buttonPreview() => const MyButton();
파라미터 설명 name미리보기 이름 group관련 미리보기 그룹화 size크기 제약 brightness라이트/다크 모드 wrapper래퍼 위젯 지정 theme테마 데이터 제공 여러 설정으로 미리보기
@Preview(group: 'Brightness',name: 'Example - light',brightness: Brightness.light,)@Preview(group: 'Brightness',name: 'Example - dark',brightness: Brightness.dark,)Widget buttonPreview() => const ButtonShowcase();
Watch out
WARNINGWidget Previewer는 몇 가지 제한 사항이 있습니다.
지원되지 않는 기능:
- 네이티브 플러그인
dart:io,dart:ffi라이브러리Flutter Web으로 빌드되기 때문에 플랫폼 네이티브 API에 접근할 수 없습니다.
에셋 경로 주의:
// 잘못된 예'assets/my_image.png'// 올바른 예 (패키지 기반 경로)'packages/my_package_name/assets/my_image.png'
결론: Widget Previewer로 전체 앱 실행 없이 위젯을 빠르게 확인할 수 있습니다.
챕터 2: Property Editor로 속성 편집하기
Why
NOTE위젯의 속성을 바꾸려면 코드를 직접 수정해야 합니다. Property Editor는 시각적 인터페이스에서 위젯 속성을 바로 편집할 수 있게 합니다.
Flutter Inspector와 Hot Reload와 함께 사용하면 실시간으로 변경 사항을 확인할 수 있습니다.
What
NOTEProperty Editor는 IDE 도구로, 위젯의 생성자 인자를 시각적으로 표시하고 편집합니다. Flutter 3.32 이상에서 사용할 수 있습니다.
How
TIPProperty Editor 사용하기
- IDE에서 Property Editor 패널을 엽니다.
- 코드에서 위젯 생성자 호출 위치에 커서를 놓습니다.
- Property Editor가 해당 위젯의 속성을 표시합니다.
@overrideWidget build(BuildContext context) {return Text('Hello World!',overflow: TextOverflow.clip, // 커서를 여기에);}속성 유형별 편집 방법
속성 유형 편집 방법 String, double, int 텍스트 입력 후 Tab 또는 Enter bool 드롭다운에서 true/false 선택 enum 드롭다운에서 값 선택 객체 (TextStyle 등) 직접 지원 안 됨, 소스 코드에서 편집 Hot Reload와 함께 사용하기
VS Code 설정:
{"files.autoSave": "afterDelay","dart.flutterHotReloadOnSave": "all"}Android Studio 설정:
Settings > Tools > Actions on Save에서 자동 저장 활성화Settings > Languages & Frameworks > Flutter에서 “Perform hot reload on save” 체크속성 라벨 이해하기
- “set”: 코드에서 명시적으로 설정된 속성
- “default”: 현재 값이 기본값과 같음
둘 다 표시되면 해당 인자를 제거해도 동작이 같습니다.
Watch out
WARNINGProperty Editor는 복잡한 객체 속성을 직접 편집하지 못합니다.
// Property Editor에서 편집 불가style: TextStyle(fontSize: 16),padding: EdgeInsets.all(8),이런 속성은 소스 코드에서 직접 수정해야 합니다.
결론: Property Editor로 간단한 속성을 빠르게 편집하고 실시간으로 확인할 수 있습니다.
챕터 3: Flutter Fix로 deprecated API 자동 수정
Why
NOTEFlutter는 빠르게 발전하면서 API가 변경되거나 deprecated됩니다. 수십 개의 파일에서 deprecated API를 수동으로 찾아 수정하는 것은 비효율적입니다.
Flutter Fix는 이 과정을 자동화합니다.
What
NOTEFlutter Fix는 deprecated API를 자동으로 감지하고 수정하는 도구입니다. IDE에서 개별 수정하거나 커맨드라인에서 프로젝트 전체를 한 번에 수정할 수 있습니다.
IDE에서는 “quick-fix”(IntelliJ/Android Studio) 또는 “code action”(VS Code)으로 불립니다.
How
TIPIDE에서 개별 수정하기
Android Studio / IntelliJ:
- deprecated API에 전구 아이콘이 나타납니다.
- 전구를 클릭하면 수정 제안이 표시됩니다.
- 제안을 클릭하면 코드가 업데이트됩니다.
VS Code:
- 에러 위에 마우스를 올리고 “Quick Fix” 링크를 클릭합니다.
- 또는 커서를 에러 위치에 놓고
Cmd+.(macOS) 또는Ctrl+.(Windows/Linux)를 누릅니다.- 수정 제안을 선택합니다.
프로젝트 전체 수정하기
Terminal window # 변경될 내용 미리보기dart fix --dry-run# 모든 수정 적용dart fix --apply예시
Terminal window $ dart fix --dry-runComputing fixes in myapp (dry run)...lib/main.dartRawScrollbar - deprecated_member_use - 3 fixesBrightness - deprecated_member_use - 1 fix4 fixes in 1 fileTerminal window $ dart fix --applyApplying fixes...lib/main.dartRawScrollbar - deprecated_member_use - 3 fixesBrightness - deprecated_member_use - 1 fix4 fixes made in 1 file
Watch out
WARNING
dart fix --apply를 실행하기 전에 반드시--dry-run으로 변경 사항을 확인하세요. 자동 수정이 예상과 다르게 동작할 수 있습니다.버전 관리 시스템을 사용 중이라면 커밋 후에 실행하는 것이 안전합니다.
결론: Flutter Fix로 deprecated API를 자동으로 찾아 수정할 수 있습니다.
챕터 4: 코드 포맷팅
Why
NOTE팀에서 코드 스타일이 다르면 리뷰 시간이 늘어납니다. “들여쓰기를 2칸으로 해야 하나, 4칸으로 해야 하나?” 같은 논쟁보다 코드 동작에 집중하는 것이 좋습니다.
자동 포맷팅은 일관된 스타일을 강제하고 논쟁을 줄입니다.
What
NOTEFlutter는
dart format명령어를 통해 Dart 스타일 가이드에 맞게 코드를 자동 포맷팅합니다. IDE에서도 저장 시 자동 포맷팅을 설정할 수 있습니다.
How
TIPVS Code에서 포맷팅
.vscode/settings.json {"editor.formatOnSave": true}또는
우클릭 > Format Document를 선택합니다.Android Studio / IntelliJ에서 포맷팅
- macOS:
Cmd + Option + L- Windows/Linux:
Ctrl + Alt + L저장 시 자동 포맷팅:
Settings > Languages & Frameworks > Flutter에서 “Format code on save” 체크커맨드라인에서 포맷팅
Terminal window # 특정 파일 포맷팅dart format lib/main.dart# 전체 프로젝트 포맷팅dart format .# 여러 경로 포맷팅dart format lib/ test/
Watch out
WARNING자동 포맷팅이 줄 길이를 80자로 제한하는 경우가 있습니다. 이는 Dart 스타일 가이드의 권장 사항입니다.
긴 줄이 여러 줄로 나뉘어도 기능에는 영향이 없습니다.
결론: 자동 포맷팅으로 일관된 코드 스타일을 유지하고 리뷰 시간을 줄입니다.
챕터 5: Hot Reload 동작 원리와 제한 사항
Why
NOTEHot Reload는 Flutter의 핵심 생산성 기능입니다. 코드를 수정하면 앱을 재시작하지 않고 1초 이내에 변경 사항이 반영됩니다.
하지만 모든 변경 사항이 Hot Reload로 반영되지는 않습니다. 언제 Hot Reload가 작동하고 언제 Hot Restart가 필요한지 이해해야 합니다.
What
NOTEHot Reload는 수정된 코드를 Dart VM에 주입하고 위젯 트리를 다시 빌드합니다. 앱의 상태는 유지되므로 로그인한 상태에서 UI를 수정해도 다시 로그인할 필요가 없습니다.
Hot Reload vs Hot Restart vs Full Restart
기능 단축키 상태 설명 Hot Reload r/Cmd+\유지 코드 변경만 반영 Hot Restart R/Shift+Cmd+\초기화 앱 상태 리셋 Full Restart 중지 후 재실행 초기화 네이티브 코드 포함 재컴파일
How
TIPHot Reload 실행하기
IDE에서:
- 파일 저장 (자동 Hot Reload 설정 시)
- Hot Reload 버튼 클릭
커맨드라인에서:
Terminal window flutter run# 앱 실행 후 터미널에서 'r' 입력Hot Reload가 작동하는 경우
build()메서드 내부 변경- 위젯 속성 변경
- 함수 로직 변경
Hot Restart가 필요한 경우
변경 유형 이유 main()수정앱 진입점은 재실행 필요 initState()수정초기화 로직은 재실행 필요 전역 변수 초기값 정적 필드는 지연 초기화됨 enum을 class로 변경 타입 변경은 재시작 필요 제네릭 타입 변경 타입 시그니처 변경 네이티브 코드 수정 Full Restart 필요 상태가 유지되는 것의 장단점
// 변경 전final sampleData = [Item(name: 'Item 1'),Item(name: 'Item 2'),];// 변경 후 - Hot Reload로 반영되지 않음final sampleData = [Item(name: 'New Item 1'), // 초기값 변경Item(name: 'New Item 2'),];
final변수의 초기값을 바꾸면 Hot Reload로 반영되지 않습니다.const로 바꾸거나 getter를 사용하면 해결됩니다.// 해결책 1: const 사용const foo = 2;const bar = foo;// 해결책 2: getter 사용const foo = 2;int get bar => foo;
Watch out
WARNINGHot Reload가 실패하는 경우
- 컴파일 에러: 코드에 문법 오류가 있으면 Hot Reload가 거부됩니다.
- 앱 종료: 앱이 백그라운드에서 종료되면 연결이 끊어집니다.
- CupertinoTabView의 builder: 알려진 버그로 Hot Reload가 적용되지 않습니다.
에러 메시지 예시:
Hot reload was rejected:'/path/to/project/lib/main.dart': error: line 33 pos 5: unbalanced ')'이 경우 해당 라인의 오류를 수정하면 됩니다.
결론: Hot Reload의 작동 원리와 제한 사항을 이해하면 효율적인 개발이 가능합니다.
한계
Flutter 개발 도구들은 강력하지만 완벽하지는 않습니다.
- Widget Previewer 제한: 네이티브 플러그인, dart
/ffi 미지원, 실험적 기능 - Property Editor 제한: 복잡한 객체 속성 편집 불가
- Flutter Fix 주의: 자동 수정이 항상 최적은 아님, 사전 검토 필요
- Hot Reload 한계: 초기화 로직, 타입 변경, 네이티브 코드는 재시작 필요
Footnotes
공유
이 글이 도움이 되었다면 다른 사람과 공유해주세요!