Developments/Flutter

Flutter dark mode using riverpod

Meuse 2023. 12. 27. 00:21
반응형

 

 

flutter_riverpod을 이용하여 다크모드를 설정

 

shared_preferences를 이용하여 폰에 다크모드 상태를 저장

 

Installing package

pubspec.yaml
dependencies:
  shared_preferences: ^2.2.2
  flutter_riverpod: ^2.4.9

 

 

Source Code

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:shared_preferences/shared_preferences.dart';
final darkModeProvider = StateProvider<bool>((ref) => false);
void main() {
WidgetsFlutterBinding.ensureInitialized();
SharedPreferences.getInstance().then((pref) {
runApp(ProviderScope(overrides: [
darkModeProvider.overrideWith((ref) => pref.getBool('darkMode') ?? false),
], child: const MyApp()));
});
}
class MyApp extends ConsumerWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
bool darkMode = ref.watch(darkModeProvider);
return MaterialApp(
title: 'riverPod darkMode',
theme: ThemeData(
useMaterial3: true,
colorSchemeSeed: Colors.cyan,
brightness: darkMode ? Brightness.dark : Brightness.light,
),
home: const MyHomePage(),
);
}
}
class MyHomePage extends ConsumerWidget {
const MyHomePage({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final colorScheme = Theme.of(context).colorScheme;
bool darkMode = ref.watch(darkModeProvider);
setDark(newValue) async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setBool('darkMode', newValue).then((bool success) {
ref.watch(darkModeProvider.notifier).update((state) => newValue);
});
}
return Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
title: const Text('dark mode using riverpod'),
),
body: Center(
child: Platform.isIOS
? CupertinoSwitch(
value: darkMode,
activeColor: colorScheme.primary,
onChanged: setDark,
)
: Switch(value: darkMode, onChanged: setDark)),
);
}
}

 

반응형