Logo
Published on
·6 min read

Flutter 문서 번역 - 테마를 사용해 색상과 글꼴 스타일 공유하기


참고: Flutter의 Material 3google_fonts 패키지를 사용합니다. Flutter 3.16 릴리스부터 Material 3가 Flutter의 기본 테마입니다.

앱 전체에 색상과 글꼴 스타일을 공유하려면, 테마(theme)를 사용하세요.

앱 전체 테마를 정의할 수 있습니다. 테마를 확장해 컴포넌트의 테마 스타일을 변경할 수 있습니다. 각 테마는 Material 컴포넌트 유형에 적용될 색상, 글꼴 스타일 및 기타 매개변수를 정의합니다.

Flutter는 다음 순서대로 스타일을 적용합니다.

  1. 특정 위젯에 적용된 스타일
  2. 인접한 상위 테마를 재정의하는 테마
  3. 전체 앱에 대한 메인 테마

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 인스턴스는 다음 두 속성에 대한 값을 설정합니다. 이 속성은 전체 앱에 영향을 줍니다.

  1. colorScheme는 색상을 정의합니다.
  2. textTheme는 텍스트 스타일을 정의합니다.

정의할 수 있는 색상, 글꼴 및 기타 속성을 알아보려면 ThemeData 문서를 확인하세요.

theme 적용

새 테마를 적용하려면 위젯의 스타일 속성을 지정할 때 Theme.of(context) 메서드를 사용하세요. 여기에는 stylecolor가 포함되지만 이에 국한되지는 않습니다.

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를 두 가지 방법으로 재정의할 수 있습니다.

  1. 고유한 ThemeData 인스턴스를 생성합니다.
  2. 상위 테마를 확장합니다.

고유한(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 에서 확인 가능합니다.