Skip to content

Commit 2419b46

Browse files
committed
language cubit added
1 parent 7a5b2a9 commit 2419b46

File tree

6 files changed

+96
-9
lines changed

6 files changed

+96
-9
lines changed

lib/bloc/app_bloc_observer.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,22 +11,22 @@ class AppBlocObserver implements BlocObserver {
1111

1212
@override
1313
void onEvent(Bloc bloc, Object? event) {
14-
_logger.info('$bloc => $event');
14+
_logger.info('${bloc.runtimeType} => $event');
1515
}
1616

1717
@override
1818
void onChange(BlocBase bloc, Change change) {
19-
_logger.info('$bloc => $change');
19+
_logger.info('${bloc.runtimeType} => $change');
2020
}
2121

2222
@override
2323
void onTransition(Bloc bloc, Transition transition) {
24-
_logger.info('$bloc => $transition');
24+
_logger.info('${bloc.runtimeType} => $transition');
2525
}
2626

2727
@override
2828
void onError(BlocBase bloc, Object error, StackTrace stackTrace) {
29-
_logger.severe('$bloc => $error, $stackTrace');
29+
_logger.severe('${bloc.runtimeType} => $error, $stackTrace');
3030
}
3131

3232
@override

lib/bloc/language/language_cubit.dart

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:flutter_bloc/flutter_bloc.dart';
3+
4+
import '../../services/preferences_service.dart';
5+
6+
class LanguageCubit extends Cubit<Locale> {
7+
LanguageCubit(Locale initialLocale) : super(initialLocale) {
8+
final locale = PreferencesService.instance.locale;
9+
emit(locale ?? initialLocale);
10+
}
11+
12+
void changeLocale(Locale locale) async {
13+
if (state == locale) {
14+
return;
15+
}
16+
17+
await PreferencesService.instance.changeLocale(locale);
18+
emit(locale);
19+
}
20+
}

lib/constants/.gitkeep

Whitespace-only changes.

lib/main.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'package:flutter/material.dart';
22
import 'package:flutter_bloc/flutter_bloc.dart';
33

4+
import 'bloc/language/language_cubit.dart';
45
import 'bloc/theme/theme_cubit.dart';
56
import 'config/init.dart';
67
import 'presentation/app.dart';
@@ -14,6 +15,9 @@ void main() async {
1415
BlocProvider(
1516
create: (_) => ThemeCubit(ThemeMode.system),
1617
),
18+
BlocProvider(
19+
create: (_) => LanguageCubit(Locale('en', 'US')),
20+
),
1721
],
1822
child: App(),
1923
),

lib/presentation/app.dart

Lines changed: 40 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart';
44
import 'package:flutter_localizations/flutter_localizations.dart';
55
import 'package:logging/logging.dart';
66

7+
import '../bloc/language/language_cubit.dart';
78
import '../bloc/theme/theme_cubit.dart';
89
import 'values/app_themes.dart';
910
import 'values/supported_locales.dart';
@@ -12,12 +13,14 @@ class App extends StatelessWidget {
1213
@override
1314
Widget build(BuildContext context) {
1415
final themeMode = context.watch<ThemeCubit>().state;
16+
final locale = context.watch<LanguageCubit>().state;
1517

1618
return MaterialApp(
1719
title: 'Placeholder Title',
1820
themeMode: themeMode,
1921
theme: AppThemes.lightTheme,
2022
darkTheme: AppThemes.darkTheme,
23+
locale: locale,
2124
supportedLocales: supportedLocales,
2225
localizationsDelegates: [
2326
GlobalMaterialLocalizations.delegate,
@@ -63,6 +66,8 @@ class _DemoPageState extends State<DemoPage> {
6366
Widget build(BuildContext context) {
6467
final themeCubit = context.watch<ThemeCubit>();
6568
final themeMode = themeCubit.state;
69+
final languageCubit = context.watch<LanguageCubit>();
70+
final locale = languageCubit.state;
6671

6772
return Scaffold(
6873
appBar: AppBar(
@@ -75,11 +80,41 @@ class _DemoPageState extends State<DemoPage> {
7580
style: Theme.of(context).textTheme.headline6,
7681
),
7782
),
78-
floatingActionButton: Switch(
79-
value: themeMode == ThemeMode.dark,
80-
onChanged: (value) {
81-
themeCubit.changeTheme(value ? ThemeMode.dark : ThemeMode.light);
82-
},
83+
floatingActionButton: Column(
84+
mainAxisSize: MainAxisSize.min,
85+
crossAxisAlignment: CrossAxisAlignment.center,
86+
children: [
87+
Row(
88+
mainAxisAlignment: MainAxisAlignment.center,
89+
children: [
90+
Text('Theme:'),
91+
SizedBox(width: 10),
92+
Switch(
93+
value: themeMode == ThemeMode.dark,
94+
onChanged: (value) {
95+
themeCubit.changeTheme(
96+
value ? ThemeMode.dark : ThemeMode.light,
97+
);
98+
},
99+
)
100+
],
101+
),
102+
Row(
103+
mainAxisAlignment: MainAxisAlignment.center,
104+
children: [
105+
Text('Language:'),
106+
SizedBox(width: 10),
107+
Switch(
108+
value: locale == Locale('az', 'AZ'),
109+
onChanged: (value) {
110+
languageCubit.changeLocale(
111+
value ? Locale('az', 'AZ') : Locale('en', 'US'),
112+
);
113+
},
114+
)
115+
],
116+
),
117+
],
83118
),
84119
floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
85120
);

lib/services/preferences_service.dart

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ class PreferencesService {
2323
}
2424

2525
final _themeModeKey = 'themeMode';
26+
final _languageCodeKey = 'languageCode';
27+
final _countryCodeKey = 'countryCode';
2628

2729
Future<void> changeThemeMode(ThemeMode themeMode) async {
2830
_sharedPreferences?.setInt(_themeModeKey, themeMode.index);
@@ -37,4 +39,30 @@ class PreferencesService {
3739

3840
return null;
3941
}
42+
43+
Future<void> changeLocale(Locale locale) async {
44+
_sharedPreferences?.setString(_languageCodeKey, locale.languageCode);
45+
_sharedPreferences?.setString(_countryCodeKey, locale.countryCode ?? '');
46+
}
47+
48+
Locale? get locale {
49+
final languageCode = _sharedPreferences?.getString(_languageCodeKey);
50+
final countryCode = _sharedPreferences?.getString(_countryCodeKey);
51+
52+
if (languageCode != null) {
53+
late String? country;
54+
55+
if (countryCode != null) {
56+
if (countryCode.isEmpty) {
57+
country = null;
58+
} else {
59+
country = countryCode;
60+
}
61+
}
62+
63+
return Locale(languageCode, country);
64+
}
65+
66+
return null;
67+
}
4068
}

0 commit comments

Comments
 (0)