[flutter] 플러터 Drawer에서 사용자가 선호하는 테마 모드를 선택하는 방법은?
플러터에서 Drawer는 앱의 네비게이션 메뉴를 제공하는데 사용되는 중요한 위젯입니다. 사용자가 앱 내에서 선호하는 테마 모드를 선택할 수 있도록 Drawer에 이 기능을 추가하는 방법에 대해 알아보겠습니다.
먼저, 플러터에서 테마 모드를 관리하기 위해 Theme
클래스를 사용합니다. Theme
클래스는 앱의 전역 테마 설정을 관리하는 역할을 합니다. 사용자가 선택한 테마 모드를 저장하고 다른 위젯에서 이 값을 참조할 수 있도록 ThemeProvider
를 사용하여 테마 모드를 관리할 수 있습니다.
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider<ThemeProvider>(
create: (_) => ThemeProvider(),
child: Consumer<ThemeProvider>(
builder: (context, themeProvider, _) {
return MaterialApp(
theme: themeProvider.getTheme(),
home: MyHomePage(),
);
},
),
);
}
}
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('My App'),
),
drawer: DrawerWidget(),
body: Container(
// 앱의 내용
),
);
}
}
class DrawerWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
ThemeProvider themeProvider = Provider.of<ThemeProvider>(context);
return Drawer(
child: ListView(
children: [
ListTile(
title: Text('라이트 모드'),
leading: Icon(Icons.brightness_5),
onTap: () {
themeProvider.setLightMode();
Navigator.pop(context);
},
),
ListTile(
title: Text('다크 모드'),
leading: Icon(Icons.brightness_2),
onTap: () {
themeProvider.setDarkMode();
Navigator.pop(context);
},
),
],
),
);
}
}
class ThemeProvider extends ChangeNotifier {
ThemeData _currentTheme = ThemeData.light();
ThemeData getTheme() => _currentTheme;
void setLightMode() {
_currentTheme = ThemeData.light();
notifyListeners();
}
void setDarkMode() {
_currentTheme = ThemeData.dark();
notifyListeners();
}
}
위의 예시 코드에서는 사용자가 라이트 모드 또는 다크 모드를 선택할 수 있는 ListTile을 Drawer 위젯 내에 생성하였습니다. 각 ListTile을 클릭하면 해당 테마 모드를 ThemeProvider
를 통해 설정하고 Drawer를 닫습니다.
ThemeProvider
클래스는 ChangeNotifier
를 상속하여 테마 모드의 변경을 감지하고 모든 구독자에게 알립니다. 각 구독자는 Consumer
를 통해 테마 모드를 감지하고 화면을 업데이트합니다.
위의 예시 코드를 사용하여 플러터 Drawer에서 사용자가 선호하는 테마 모드를 선택할 수 있습니다. 이를 응용하여 필요한 추가 기능을 구현하거나 UI를 개선할 수 있습니다.