Skip to content

Commit 1247c2a

Browse files
committed
Add app settings local data source for locale management and update localization provider
1 parent ff27398 commit 1247c2a

File tree

5 files changed

+76
-3
lines changed

5 files changed

+76
-3
lines changed

lib/app/app.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import 'package:provider/provider.dart';
55
import 'package:tmdb_flutter/app/cubit/favorite_movies_cubit.dart';
66
import 'package:tmdb_flutter/app/cubit/home_cubit.dart';
77
import 'package:tmdb_flutter/app/cubit/movie_details_cubit.dart';
8+
import 'package:tmdb_flutter/app/data/local/app_settings_local_data_source.dart';
89
import 'package:tmdb_flutter/app/injection.dart';
910
import 'package:tmdb_flutter/app/providers/localization_provider.dart';
1011
import 'package:tmdb_flutter/app/view/main_page.dart';
@@ -18,7 +19,7 @@ class App extends StatelessWidget {
1819
return MultiProvider(
1920
providers: [
2021
ChangeNotifierProvider(
21-
create: (_) => LocalizationProvider(),
22+
create: (_) => LocalizationProvider(getIt<AppSettingsLocalDataSource>()),
2223
),
2324
BlocProvider(
2425
create: (context) => getIt<HomeCubit>(),
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import 'package:sqflite/sqflite.dart';
2+
import 'package:tmdb_flutter/app/data/local/database_helper.dart';
3+
4+
class AppSettingsLocalDataSource {
5+
AppSettingsLocalDataSource(this._databaseHelper);
6+
7+
final DatabaseHelper _databaseHelper;
8+
static const String _localeKey = 'locale';
9+
10+
Future<void> saveLocale(String languageCode) async {
11+
final db = await _databaseHelper.database;
12+
await db.insert(
13+
'app_settings',
14+
{
15+
'key': _localeKey,
16+
'value': languageCode,
17+
},
18+
conflictAlgorithm: ConflictAlgorithm.replace,
19+
);
20+
}
21+
22+
Future<String?> getLocale() async {
23+
final db = await _databaseHelper.database;
24+
final result = await db.query(
25+
'app_settings',
26+
where: 'key = ?',
27+
whereArgs: [_localeKey],
28+
);
29+
if (result.isEmpty) return null;
30+
return result.first['value']! as String;
31+
}
32+
}

lib/app/data/local/database_helper.dart

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,9 @@ class DatabaseHelper {
1919
final path = join(await getDatabasesPath(), 'favorite_movies.db');
2020
return openDatabase(
2121
path,
22-
version: 1,
22+
version: 2,
2323
onCreate: _onCreate,
24+
onUpgrade: _onUpgrade,
2425
);
2526
}
2627

@@ -37,5 +38,25 @@ class DatabaseHelper {
3738
createdAt TEXT NOT NULL
3839
)
3940
''');
41+
42+
await db.execute('''
43+
CREATE TABLE app_settings(
44+
id INTEGER PRIMARY KEY,
45+
key TEXT NOT NULL UNIQUE,
46+
value TEXT NOT NULL
47+
)
48+
''');
49+
}
50+
51+
Future<void> _onUpgrade(Database db, int oldVersion, int newVersion) async {
52+
if (oldVersion < 2) {
53+
await db.execute('''
54+
CREATE TABLE app_settings(
55+
id INTEGER PRIMARY KEY,
56+
key TEXT NOT NULL UNIQUE,
57+
value TEXT NOT NULL
58+
)
59+
''');
60+
}
4061
}
4162
}

lib/app/injection.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import 'package:get_it/get_it.dart';
22
import 'package:injectable/injectable.dart';
33
import 'package:tmdb_flutter/app/cubit/favorite_movies_cubit.dart';
44
import 'package:tmdb_flutter/app/cubit/home_cubit.dart';
5+
import 'package:tmdb_flutter/app/data/local/app_settings_local_data_source.dart';
56
import 'package:tmdb_flutter/app/data/local/database_helper.dart';
67
import 'package:tmdb_flutter/app/data/local/favorite_movies_local_data_source.dart';
78
import 'package:tmdb_flutter/app/data/remote/movie_api.dart';
@@ -18,6 +19,9 @@ Future<void> configureDependencies() async {
1819
..registerSingleton<MovieAPI>(MovieAPI())
1920

2021
// Register factories
22+
..registerFactory<AppSettingsLocalDataSource>(
23+
() => AppSettingsLocalDataSource(getIt<DatabaseHelper>()),
24+
)
2125
..registerFactory<FavoriteMoviesLocalDataSource>(
2226
() => FavoriteMoviesLocalDataSource(getIt<DatabaseHelper>()),
2327
)
Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,27 @@
11
import 'package:flutter/material.dart';
2+
import 'package:tmdb_flutter/app/data/local/app_settings_local_data_source.dart';
23

34
class LocalizationProvider extends ChangeNotifier {
5+
LocalizationProvider(this._appSettingsLocalDataSource) {
6+
_loadLocale();
7+
}
8+
9+
final AppSettingsLocalDataSource _appSettingsLocalDataSource;
410
Locale _locale = const Locale('en');
511

612
Locale get locale => _locale;
713

8-
void setLocale(String languageCode) {
14+
Future<void> _loadLocale() async {
15+
final savedLocale = await _appSettingsLocalDataSource.getLocale();
16+
if (savedLocale != null) {
17+
_locale = Locale(savedLocale);
18+
notifyListeners();
19+
}
20+
}
21+
22+
Future<void> setLocale(String languageCode) async {
923
_locale = Locale(languageCode);
24+
await _appSettingsLocalDataSource.saveLocale(languageCode);
1025
notifyListeners();
1126
}
1227
}

0 commit comments

Comments
 (0)