플러터 애플리케이션에서 다크모드와 라이트모드를 손쉽게 전환할 수 있습니다. 이 글에서는 Flutter 다크모드를 Provider를 사용하여 구현하는 방법을 단계별로 설명합니다.
목차
Flutter 다크모드
다크모드는 화면의 밝기를 낮춰서 사용자가 눈의 피로를 덜 느끼도록 해주는 기능입니다. 라이트모드는 그 반대로 밝은 화면을 제공합니다. 두 모드를 지원하면 사용자가 자신의 선호에 따라 화면 모드를 변경할 수 있습니다.
Provider 설치 및 설정
먼저 pubspec.yaml
파일에 provider
패키지를 추가해야 합니다.
dependencies: flutter: sdk: flutter provider: ^6.1.2
테마 데이터 정의하기
이제 다크모드와 라이트모드에 사용될 테마 데이터를 정의합니다.
import 'package:flutter/material.dart'; final ThemeData lightTheme = ThemeData( primarySwatch: Colors.blue, brightness: Brightness.light, ); final ThemeData darkTheme = ThemeData( primarySwatch: Colors.blue, brightness: Brightness.dark, );
ChangeNotifier 클래스 구현
다음으로, 테마 모드를 관리할 ChangeNotifier
클래스를 구현합니다:
import 'package:flutter/material.dart'; class ThemeNotifier extends ChangeNotifier { ThemeData _currentTheme; bool _isDarkMode; ThemeNotifier(this._isDarkMode) { _currentTheme = _isDarkMode ? darkTheme : lightTheme; } ThemeData get currentTheme => _currentTheme; bool get isDarkMode => _isDarkMode; void toggleTheme() { _isDarkMode = !_isDarkMode; _currentTheme = _isDarkMode ? darkTheme : lightTheme; notifyListeners(); } }
Provider로 테마 전환 상태 관리하기
테마 관리 클래스를 앱 전체에서 사용할 수 있도록 MultiProvider
를 설정합니다.
import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; void main() { runApp( ChangeNotifierProvider( create: (_) => ThemeNotifier(false), // 기본 테마를 라이트모드로 설정 child: MyApp(), ), ); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return Consumer<ThemeNotifier>( builder: (context, themeNotifier, child) { return MaterialApp( theme: themeNotifier.currentTheme, home: HomeScreen(), ); }, ); } }
홈 스크린 구현 및 테마 전환 버튼 추가
테마를 전환할 수 있는 버튼을 포함한 홈 스크린을 구현합니다.
import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; class HomeScreen extends StatelessWidget { @override Widget build(BuildContext context) { ThemeNotifier themeNotifier = Provider.of<ThemeNotifier>(context); return Scaffold( appBar: AppBar( title: Text( themeNotifier.isDarkMode ? "Dark Mode" : "Light Mode", style: TextStyle( color: themeNotifier.isDarkMode ? Colors.white : Colors.grey.shade900), ), actions: [ Switch( value: themeNotifier.isDarkMode, onChanged: (value) { themeNotifier.toggleTheme(); }, activeTrackColor: Colors.lightBlueAccent, activeColor: Colors.blue, ), ], ), ); } }