Skip to content

Commit bf86ee6

Browse files
hawkkillerclaude
andcommitted
refactor: simplify settings data layer
Remove SettingsLocalDatasource and manual codecs, implement persistence directly in SettingsRepositoryImpl. Migrate Settings and GeneralSettings to freezed with json_serializable for codegen-based serialization. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 378bd21 commit bf86ee6

File tree

9 files changed

+117
-175
lines changed

9 files changed

+117
-175
lines changed

app/lib/src/feature/settings/data/datasources/settings_local_datasource.dart

Lines changed: 0 additions & 42 deletions
This file was deleted.

app/lib/src/feature/settings/data/mappers/general_settings_codec.dart

Lines changed: 0 additions & 51 deletions
This file was deleted.

app/lib/src/feature/settings/data/mappers/settings_codec.dart

Lines changed: 0 additions & 27 deletions
This file was deleted.
Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,31 @@
11
import 'dart:async';
22

3-
import 'package:sizzle_starter/src/feature/settings/data/datasources/settings_local_datasource.dart';
3+
import 'package:common/common.dart';
4+
import 'package:shared_preferences/shared_preferences.dart';
5+
46
import 'package:sizzle_starter/src/feature/settings/domain/model/settings.dart';
57
import 'package:sizzle_starter/src/feature/settings/domain/repositories/settings_repository.dart';
68

79
final class SettingsRepositoryImpl implements SettingsRepository {
8-
const SettingsRepositoryImpl({required this.localDatasource});
10+
const SettingsRepositoryImpl({required this.sharedPreferences});
11+
12+
final SharedPreferencesAsync sharedPreferences;
913

10-
final SettingsLocalDatasource localDatasource;
14+
SharedPreferencesColumnJson get _column => SharedPreferencesColumnJson(
15+
sharedPreferences: sharedPreferences,
16+
key: 'settings',
17+
);
1118

1219
@override
1320
Future<void> save(Settings settings) async {
14-
await localDatasource.save(settings);
21+
await _column.set(settings.toJson());
1522
}
1623

1724
@override
1825
Future<Settings> read() async {
19-
return await localDatasource.read();
26+
final settingsMap = await _column.read();
27+
if (settingsMap == null) return const Settings();
28+
29+
return Settings.fromJson(settingsMap);
2030
}
2131
}
Lines changed: 20 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,28 @@
11
import 'dart:ui' show Color, Locale;
22

3+
import 'package:freezed_annotation/freezed_annotation.dart';
4+
5+
part 'general.freezed.dart';
6+
part 'general.g.dart';
7+
38
/// Possible theme modes for the application.
49
enum ThemeModeVO { light, dark, system }
510

611
/// Class that holds values used for constructing a theme for the app.
7-
final class GeneralSettings {
8-
const GeneralSettings({
9-
this.locale = const Locale('en'),
10-
this.themeMode = ThemeModeVO.system,
11-
this.seedColor = const Color(0xFF6200EE),
12-
});
13-
14-
final ThemeModeVO themeMode;
15-
final Color seedColor;
16-
final Locale locale;
12+
@freezed
13+
abstract class GeneralSettings with _$GeneralSettings {
14+
const factory GeneralSettings({
15+
@Default(Locale('en')) @JsonKey(toJson: _localeToJson, fromJson: _localeFromJson) Locale locale,
16+
@Default(ThemeModeVO.system) ThemeModeVO themeMode,
17+
@Default(Color(0xFF6200EE))
18+
@JsonKey(toJson: _colorToARGB32, fromJson: _colorFromARGB32)
19+
Color seedColor,
20+
}) = _GeneralSettings;
1721

18-
GeneralSettings copyWith({ThemeModeVO? themeMode, Color? seedColor, Locale? locale}) {
19-
return GeneralSettings(
20-
themeMode: themeMode ?? this.themeMode,
21-
seedColor: seedColor ?? this.seedColor,
22-
locale: locale ?? this.locale,
23-
);
24-
}
25-
26-
@override
27-
bool operator ==(Object other) =>
28-
identical(this, other) ||
29-
other is GeneralSettings &&
30-
seedColor == other.seedColor &&
31-
themeMode == other.themeMode &&
32-
locale == other.locale;
33-
34-
@override
35-
int get hashCode => Object.hash(seedColor, themeMode, locale);
22+
factory GeneralSettings.fromJson(Map<String, Object?> json) => _$GeneralSettingsFromJson(json);
3623
}
24+
25+
String _localeToJson(Locale locale) => locale.toString();
26+
Locale _localeFromJson(String json) => Locale(json);
27+
int _colorToARGB32(Color color) => color.toARGB32();
28+
Color _colorFromARGB32(int argb32) => Color(argb32);
Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,13 @@
1+
import 'package:freezed_annotation/freezed_annotation.dart';
12
import 'package:sizzle_starter/src/feature/settings/domain/model/general.dart';
23

3-
/// Settings for the app.
4-
class Settings {
5-
const Settings({this.general = const GeneralSettings()});
6-
7-
final GeneralSettings general;
8-
9-
Settings copyWith({GeneralSettings? general}) => Settings(
10-
general: general ?? this.general,
11-
);
4+
part 'settings.freezed.dart';
5+
part 'settings.g.dart';
126

13-
@override
14-
bool operator ==(Object other) {
15-
if (identical(this, other)) return true;
16-
17-
return other is Settings && other.general == general;
18-
}
7+
/// Settings for the app.
8+
@freezed
9+
abstract class Settings with _$Settings {
10+
const factory Settings({@Default(GeneralSettings()) GeneralSettings general}) = _Settings;
1911

20-
@override
21-
int get hashCode => general.hashCode;
12+
factory Settings.fromJson(Map<String, Object?> json) => _$SettingsFromJson(json);
2213
}

app/lib/src/feature/settings/injection.dart

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import 'package:shared_preferences/shared_preferences.dart';
22

33
import 'package:sizzle_starter/src/feature/settings/application/settings_service.dart';
4-
import 'package:sizzle_starter/src/feature/settings/data/datasources/settings_local_datasource.dart';
54
import 'package:sizzle_starter/src/feature/settings/data/repositories/settings_repository_impl.dart';
65

76
/// Container with global settings state.
@@ -16,9 +15,7 @@ class SettingsContainer {
1615
required SharedPreferencesAsync sharedPreferences,
1716
}) async {
1817
final settingsRepository = SettingsRepositoryImpl(
19-
localDatasource: SettingsLocalDatasourceSharedPreferences(
20-
sharedPreferences: sharedPreferences,
21-
),
18+
sharedPreferences: sharedPreferences,
2219
);
2320

2421
final settingsService = await SettingsServiceImpl.create(repository: settingsRepository);

app/pubspec.yaml

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ dependencies:
2525
clock: 1.1.2
2626
package_info_plus: ^9.0.0
2727

28+
# Code Generation
29+
json_annotation: ^4.10.0
30+
freezed_annotation: ^3.1.0
31+
2832
# Core
2933
rest_client:
3034
path: ../core/rest_client
@@ -39,12 +43,16 @@ dependencies:
3943
ui_library:
4044
path: ../core/ui_library
4145

42-
4346
dev_dependencies:
4447
# Testing
4548
flutter_test:
4649
sdk: flutter
4750

51+
# Code Generation
52+
build_runner: ^2.11.1
53+
json_serializable: ^6.12.0
54+
freezed: ^3.2.5
55+
4856
flutter:
4957
uses-material-design: true
5058

0 commit comments

Comments
 (0)