- Published on
- ·6 min read
Flutter 문서 번역 - 테마를 사용해 색상과 글꼴 스타일 공유하기
- 이 글은 Flutter 문서 Use themes to share colors and font styles를 번역한 글입니다.
- 번역 기준일: 2024년 1월 21일
참고: Flutter의 Material 3와 google_fonts 패키지를 사용합니다. Flutter 3.16 릴리스부터 Material 3가 Flutter의 기본 테마입니다.
앱 전체에 색상과 글꼴 스타일을 공유하려면, 테마(theme)를 사용하세요.
앱 전체 테마를 정의할 수 있습니다. 테마를 확장해 컴포넌트의 테마 스타일을 변경할 수 있습니다. 각 테마는 Material 컴포넌트 유형에 적용될 색상, 글꼴 스타일 및 기타 매개변수를 정의합니다.
Flutter는 다음 순서대로 스타일을 적용합니다.
- 특정 위젯에 적용된 스타일
- 인접한 상위 테마를 재정의하는 테마
- 전체 앱에 대한 메인 테마
Theme
를 정의한 후, 각 위젯에서 사용하세요. Flutter의 Material 위젯은 theme를 사용해 앱 바, 버튼, 체크박스 등의 배경 색상과 글꼴 스타일을 설정합니다.
앱 테마 만들기
앱 전체에 Theme
를 공유하려면, MaterialApp
생성자의 theme
속성을 설정하세요. 이 속성은 ThemeData
인스턴스를 사용합니다.
Flutter 3.16 릴리스부터 Material 3가 Flutter의 기본 테마입니다.
생성자에서 테마를 지정하지 않으면, Flutter가 기본 테마를 생성합니다.
MaterialApp(
title: appName,
theme: ThemeData(
useMaterial3: true,
// 기본 brightness와 colors 정의
colorScheme: ColorScheme.fromSeed(
seedColor: Colors.purple,
// ···
brightness: Brightness.dark,
),
// 기본 `TextTheme` 정의. 이것을 사용해 헤드라인, 제목, 본문 등의 기본 텍스트 스타일을 지정
textTheme: TextTheme(
displayLarge: const TextStyle(
fontSize: 72,
fontWeight: FontWeight.bold,
),
// ···
titleLarge: GoogleFonts.oswald(
fontSize: 30,
fontStyle: FontStyle.italic,
),
bodyMedium: GoogleFonts.merriweather(),
displaySmall: GoogleFonts.pacifico(),
),
),
home: const MyHomePage(
title: appName,
),
);
대부분의 ThemeData
인스턴스는 다음 두 속성에 대한 값을 설정합니다. 이 속성은 전체 앱에 영향을 줍니다.
- colorScheme는 색상을 정의합니다.
- textTheme는 텍스트 스타일을 정의합니다.
정의할 수 있는 색상, 글꼴 및 기타 속성을 알아보려면 ThemeData 문서를 확인하세요.
theme 적용
새 테마를 적용하려면 위젯의 스타일 속성을 지정할 때 Theme.of(context)
메서드를 사용하세요. 여기에는 style
과 color
가 포함되지만 이에 국한되지는 않습니다.
Theme.of(context)
메서드는 위젯 트리를 찾아서 가장 가까운 Theme
를 검색합니다. 독립적인 Theme
가 있다면 그것이 적용됩니다. 그렇지 않다면, Flutter가 앱의 테마를 적용합니다.
다음 예제에서 Container
생성자는 이 기법을 사용해 color
를 설정합니다.
Container(
padding: const EdgeInsets.symmetric(
horizontal: 12,
vertical: 12,
),
color: Theme.of(context).colorScheme.primary,
child: Text(
'Text with a background color',
// ···
style: Theme.of(context).textTheme.bodyMedium!.copyWith(
color: Theme.of(context).colorScheme.onPrimary,
),
),
),
theme 재정의
앱의 일부분에 전체 테마를 재정의하려면, 앱의 해당 섹션을 Theme
위젯으로 감싸세요.
theme를 두 가지 방법으로 재정의할 수 있습니다.
- 고유한
ThemeData
인스턴스를 생성합니다. - 상위 테마를 확장합니다.
고유한(unique) ThemeData 인스턴스 설정
앱의 컴포넌트가 전체 테마를 무시하도록 하려면, ThemeData
인스턴스를 생성하세요. 그 인스턴스를 Theme
위젯에 전달하세요.
Theme(
// `ThemeData`로 고유한 테마 생성
data: ThemeData(
colorScheme: ColorScheme.fromSeed(
seedColor: Colors.pink,
),
),
child: FloatingActionButton(
onPressed: () {},
child: const Icon(Icons.add),
),
);
상위(parent) 테마 확장
모든 것을 재정의(override)하는 대신, 상위 테마를 확장하세요. 테마를 확장하려면 copyWith() 메서드를 사용하세요.
Theme(
// `copyWith`를 사용해 상위 테마를 찾고 확장하세요.
// 자세한 내용은 `Theme.of` 섹션을 확인하세요.
data: Theme.of(context).copyWith(
colorScheme: ColorScheme.fromSeed(
seedColor: Colors.pink,
),
),
child: const FloatingActionButton(
onPressed: null,
child: Icon(Icons.add),
),
);
Theme
에 대한 영상 보기
자세한 내용은 Theme 위젯에 대한 짧은 Widget of the Week 비디오를 시청하세요.
대화형(interactive) 예제
예제는 원문, Use themes to share colors and font styles > Try an interactive example 에서 확인 가능합니다.