diff --git a/analysis_options.yaml b/analysis_options.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..f9b303465f19b5fbf5ec669cd083c9cc38ecda9a
--- /dev/null
+++ b/analysis_options.yaml
@@ -0,0 +1 @@
+include: package:flutter_lints/flutter.yaml
diff --git a/android/gradle.properties b/android/gradle.properties
index b87ac7c88e3a98a757a90bff89e63fb14b2f355b..de9dc0d19ce1de34abbab2c48a8182abf6d2642c 100644
--- a/android/gradle.properties
+++ b/android/gradle.properties
@@ -1,5 +1,5 @@
 org.gradle.jvmargs=-Xmx1536M
 android.useAndroidX=true
 android.enableJetifier=true
-app.versionName=0.0.52
-app.versionCode=52
+app.versionName=0.0.53
+app.versionCode=53
diff --git a/fastlane/metadata/android/en-US/changelogs/53.txt b/fastlane/metadata/android/en-US/changelogs/53.txt
new file mode 100644
index 0000000000000000000000000000000000000000..6ab11150150fc75a46c9acc317890208e5a120b9
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/53.txt
@@ -0,0 +1 @@
+Add automatic flutter linter. Apply code lints. Update dependencies.
diff --git a/fastlane/metadata/android/fr-FR/changelogs/53.txt b/fastlane/metadata/android/fr-FR/changelogs/53.txt
new file mode 100644
index 0000000000000000000000000000000000000000..609f5cf6e95a8df0799865df2e1ebde8fa981e5a
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/53.txt
@@ -0,0 +1 @@
+Ajout d'un correcteur automatique de code. Application des corrections. Mise à jour des dépendances.
diff --git a/lib/models/artists.dart b/lib/models/artists.dart
index e9eaf5e698f862823478523ffd36ec28f9964dca..aaf3b9627f90507d950b5d994e0e1a083d73de9b 100644
--- a/lib/models/artists.dart
+++ b/lib/models/artists.dart
@@ -21,13 +21,14 @@ class Artist {
 
   Map<String, Object?>? toJson() {
     return {
-      'id': this.id,
-      'name': this.name,
-      'mbid': this.mbid,
+      'id': id,
+      'name': name,
+      'mbid': mbid,
     };
   }
 
+  @override
   String toString() {
-    return jsonEncode(this.toJson());
+    return jsonEncode(toJson());
   }
 }
diff --git a/lib/models/counts_by_day.dart b/lib/models/counts_by_day.dart
index 27e41f6783fc5e4f408e2266723d5dc1fb5c3079..cfc22631307aac5f880d313645681168b01780bc 100644
--- a/lib/models/counts_by_day.dart
+++ b/lib/models/counts_by_day.dart
@@ -22,15 +22,16 @@ class CountsByDayData {
   Map<String, Object?>? toJson() {
     Map<String, double> map = {};
 
-    this.data.keys.forEach((day) {
-      double? value = this.data[day];
+    for (var day in data.keys) {
+      double? value = data[day];
       map[day.toString()] = value != null ? value.toDouble() : 0.0;
-    });
+    }
 
     return {'counts-by-day': map};
   }
 
+  @override
   String toString() {
-    return jsonEncode(this.toJson());
+    return jsonEncode(toJson());
   }
 }
diff --git a/lib/models/counts_by_hour.dart b/lib/models/counts_by_hour.dart
index 7bf380294d2dc2addace67a473cbe05865ac1d69..5073ace368bd5eacfe2dde744a7d07d6ca4cdea7 100644
--- a/lib/models/counts_by_hour.dart
+++ b/lib/models/counts_by_hour.dart
@@ -24,15 +24,16 @@ class CountsByHourData {
   Map<String, Object?>? toJson() {
     Map<String, double> map = {};
 
-    this.data.keys.forEach((day) {
-      double? value = this.data[day];
+    for (var day in data.keys) {
+      double? value = data[day];
       map[day.toString()] = value != null ? value.toDouble() : 0.0;
-    });
+    }
 
     return {'counts-by-hour': map};
   }
 
+  @override
   String toString() {
-    return jsonEncode(this.toJson());
+    return jsonEncode(toJson());
   }
 }
diff --git a/lib/models/discoveries.dart b/lib/models/discoveries.dart
index 386098f5304e5b7b326c7b48f3e3ba187f7602fd..89eea2f497def84cc5721f84bc82a6eeb6658ba9 100644
--- a/lib/models/discoveries.dart
+++ b/lib/models/discoveries.dart
@@ -39,18 +39,19 @@ class DiscoveriesData {
   Map<String, Object?>? toJson() {
     Map<String, Map<String, int>> map = {};
 
-    this.data.keys.forEach((element) {
-      DiscoveriesDataValue? item = this.data[element];
+    for (var element in data.keys) {
+      DiscoveriesDataValue? item = data[element];
       map[element] = {
         'new-artists': item != null ? item.newArtistsCount : 0,
         'new-tracks': item != null ? item.newTracksCount : 0,
       };
-    });
+    }
 
     return map;
   }
 
+  @override
   String toString() {
-    return jsonEncode(this.toJson());
+    return jsonEncode(toJson());
   }
 }
diff --git a/lib/models/heatmap.dart b/lib/models/heatmap.dart
index 81a06ee89314294763ca8f40e721a978723fde06..4722e2bffc59b7c6079b0dc5b2c7f4b739b0d34d 100644
--- a/lib/models/heatmap.dart
+++ b/lib/models/heatmap.dart
@@ -15,9 +15,9 @@ class HeatmapData {
         Map<String, dynamic> rawDataForThisDay = json['heatmap'][day];
 
         Map<int, int> dataForThisDay = {};
-        rawDataForThisDay.keys.forEach((hour) {
+        for (var hour in rawDataForThisDay.keys) {
           dataForThisDay[int.parse(hour)] = int.parse(rawDataForThisDay[hour].toString());
-        });
+        }
 
         data[int.parse(day)] = dataForThisDay;
       });
@@ -29,18 +29,19 @@ class HeatmapData {
   Map<String, dynamic> toJson() {
     Map<String, Map<String, int>> map = {};
 
-    this.data.keys.forEach((day) {
+    for (var day in data.keys) {
       Map<String, int> dayMap = {};
-      this.data[day]?.forEach((hour, count) {
+      data[day]?.forEach((hour, count) {
         dayMap[hour.toString()] = count;
       });
       map[day.toString()] = dayMap;
-    });
+    }
 
     return {'heatmap': map};
   }
 
+  @override
   String toString() {
-    return jsonEncode(this.toJson());
+    return jsonEncode(toJson());
   }
 }
diff --git a/lib/models/new_artists.dart b/lib/models/new_artists.dart
index d0c4b6a69fab06b76f570cb9f711066147421fde..fffafc628d11ab099f053db462d74d6590adbc73 100644
--- a/lib/models/new_artists.dart
+++ b/lib/models/new_artists.dart
@@ -43,19 +43,20 @@ class NewArtistsData {
   List<Map<String, dynamic>> toJson() {
     List<Map<String, dynamic>> list = [];
 
-    this.data.forEach((item) {
+    for (var item in data) {
       list.add({
         'firstPlayed': {
-          'date': item.firstPlayed != null ? item.firstPlayed.toString() : null,
+          'date': item.firstPlayed?.toString(),
         },
         'artist': item.artist?.toJson(),
       });
-    });
+    }
 
     return list;
   }
 
+  @override
   String toString() {
-    return jsonEncode(this.toJson());
+    return jsonEncode(toJson());
   }
 }
diff --git a/lib/models/new_tracks.dart b/lib/models/new_tracks.dart
index 101c4334df229ba85c56aa03a38ca5477af49c0e..b1105effacdb46a2b19381bf4eda68bd6e67578a 100644
--- a/lib/models/new_tracks.dart
+++ b/lib/models/new_tracks.dart
@@ -43,19 +43,20 @@ class NewTracksData {
   List<Map<String, dynamic>> toJson() {
     List<Map<String, dynamic>> list = [];
 
-    this.data.forEach((item) {
+    for (var item in data) {
       list.add({
         'firstPlayed': {
-          'date': item.firstPlayed != null ? item.firstPlayed.toString() : null,
+          'date': item.firstPlayed?.toString(),
         },
         'track': item.track?.toJson(),
       });
-    });
+    }
 
     return list;
   }
 
+  @override
   String toString() {
-    return jsonEncode(this.toJson());
+    return jsonEncode(toJson());
   }
 }
diff --git a/lib/models/statistics_global.dart b/lib/models/statistics_global.dart
index 1f87265ed5902f2515066761fc7c7d9cea515de9..065d10ebb491f8485b74529fe49249f89c57d72a 100644
--- a/lib/models/statistics_global.dart
+++ b/lib/models/statistics_global.dart
@@ -22,14 +22,15 @@ class StatisticsGlobalData {
 
   Map<String, Object?>? toJson() {
     return <String, Object?>{
-      'totalCount': this.totalCount,
+      'totalCount': totalCount,
       'lastScrobble': {
-        'date': this.lastScrobble != null ? this.lastScrobble.toString() : null,
+        'date': lastScrobble?.toString(),
       },
     };
   }
 
+  @override
   String toString() {
-    return jsonEncode(this.toJson());
+    return jsonEncode(toJson());
   }
 }
diff --git a/lib/models/statistics_recent.dart b/lib/models/statistics_recent.dart
index 1f342f9e7d0627789d097eeb17ca5ce8a761ac32..2d204bb8d4392eea7161d9e32946fc0300fe3fa3 100644
--- a/lib/models/statistics_recent.dart
+++ b/lib/models/statistics_recent.dart
@@ -29,14 +29,15 @@ class StatisticsRecentData {
 
   Map<String, Object?>? toJson() {
     return <String, Object?>{
-      'recentCount': this.recentCount,
-      'firstPlayedArtistsCount': this.firstPlayedArtistsCount,
-      'firstPlayedTracksCount': this.firstPlayedTracksCount,
-      'selectedPeriod': this.selectedPeriod,
+      'recentCount': recentCount,
+      'firstPlayedArtistsCount': firstPlayedArtistsCount,
+      'firstPlayedTracksCount': firstPlayedTracksCount,
+      'selectedPeriod': selectedPeriod,
     };
   }
 
+  @override
   String toString() {
-    return jsonEncode(this.toJson());
+    return jsonEncode(toJson());
   }
 }
diff --git a/lib/models/timeline.dart b/lib/models/timeline.dart
index 37f987bffb13395954c16714daf91c8eda54ed27..14bd42885e8707b9e2d8a5ef4c273809dc8fad2c 100644
--- a/lib/models/timeline.dart
+++ b/lib/models/timeline.dart
@@ -39,18 +39,19 @@ class TimelineData {
   Map<String, Object?>? toJson() {
     Map<String, Map<String, int>> map = {};
 
-    this.data.keys.forEach((element) {
-      TimelineDataValue? item = this.data[element];
+    for (var element in data.keys) {
+      TimelineDataValue? item = data[element];
       map[element] = {
         'counts': item != null ? item.counts : 0,
         'eclecticism': item != null ? item.eclecticism : 0,
       };
-    });
+    }
 
     return map;
   }
 
+  @override
   String toString() {
-    return jsonEncode(this.toJson());
+    return jsonEncode(toJson());
   }
 }
diff --git a/lib/models/topartists.dart b/lib/models/topartists.dart
index 47013c8445cae37fce5025b3a22f7933906eb617..31b87df292b03c5f5040b40be34da43b30a761be 100644
--- a/lib/models/topartists.dart
+++ b/lib/models/topartists.dart
@@ -38,7 +38,7 @@ class TopArtistsStreamDataValue {
 
   @override
   String toString() {
-    return jsonEncode(this.toJson());
+    return jsonEncode(toJson());
   }
 }
 
@@ -98,15 +98,15 @@ class TopArtistsData {
     List<Map<String, Object>> listArtists = [];
     Map<String, List<Map<String, double>>> artistsStreamMap = {};
 
-    this.topArtists.forEach((TopArtistsDataValue? item) {
+    for (TopArtistsDataValue item in topArtists) {
       listArtists.add({
-        'artistName': item != null ? item.artistName : '',
-        'count': item != null ? item.count : 0,
+        'artistName': item.artistName,
+        'count': item.count,
       });
-    });
+    }
 
-    this.topArtistsStream.keys.forEach((dateAsString) {
-      List<TopArtistsStreamDataValue>? items = this.topArtistsStream[dateAsString];
+    for (var dateAsString in topArtistsStream.keys) {
+      List<TopArtistsStreamDataValue>? items = topArtistsStream[dateAsString];
       List<Map<String, double>> values = [];
       items?.forEach((item) {
         values.add({
@@ -114,7 +114,7 @@ class TopArtistsData {
         });
       });
       artistsStreamMap[dateAsString] = values;
-    });
+    }
 
     return {
       'top-artists': listArtists,
@@ -122,7 +122,8 @@ class TopArtistsData {
     };
   }
 
+  @override
   String toString() {
-    return jsonEncode(this.toJson());
+    return jsonEncode(toJson());
   }
 }
diff --git a/lib/models/track.dart b/lib/models/track.dart
index 4630b88d7bfe0abe2ecb27205a40f12d1fddecc7..39e3d6a8d9994df8c7a4d7f342068a2fea4e4358 100644
--- a/lib/models/track.dart
+++ b/lib/models/track.dart
@@ -26,14 +26,15 @@ class Track {
 
   Map<String, Object?>? toJson() {
     return {
-      'id': this.id,
-      'name': this.name,
-      'mbid': this.mbid,
-      'artist': this.artist.toJson(),
+      'id': id,
+      'name': name,
+      'mbid': mbid,
+      'artist': artist.toJson(),
     };
   }
 
+  @override
   String toString() {
-    return jsonEncode(this.toJson());
+    return jsonEncode(toJson());
   }
 }
diff --git a/lib/network/scrobbles.dart b/lib/network/scrobbles.dart
index 3e58697bf0d9651ab06cf9d8a11c57d01ad00589..3592365eaade76d0777bf7b2d6631ee582a44399 100644
--- a/lib/network/scrobbles.dart
+++ b/lib/network/scrobbles.dart
@@ -16,7 +16,7 @@ class ScrobblesApi {
   static String baseUrl = 'https://scrobble.harrault.fr';
 
   static Future<StatisticsGlobalData> fetchGlobalStatistics() async {
-    final String url = baseUrl + '/stats';
+    final String url = '$baseUrl/stats';
     final response = await http.get(Uri.parse(url));
 
     if (response.statusCode == 200) {
@@ -27,7 +27,7 @@ class ScrobblesApi {
   }
 
   static Future<StatisticsRecentData> fetchRecentStatistics(int daysCount) async {
-    final String url = baseUrl + '/' + daysCount.toString() + '/stats';
+    final String url = '$baseUrl/$daysCount/stats';
     final response = await http.get(Uri.parse(url));
 
     if (response.statusCode == 200) {
@@ -38,7 +38,7 @@ class ScrobblesApi {
   }
 
   static Future<TimelineData> fetchTimeline(int daysCount) async {
-    final String url = baseUrl + '/data/' + daysCount.toString() + '/timeline';
+    final String url = '$baseUrl/data/$daysCount/timeline';
     final response = await http.get(Uri.parse(url));
 
     if (response.statusCode == 200) {
@@ -49,7 +49,7 @@ class ScrobblesApi {
   }
 
   static Future<CountsByDayData> fetchCountsByDay(int daysCount) async {
-    final String url = baseUrl + '/data/' + daysCount.toString() + '/counts-by-day';
+    final String url = '$baseUrl/data/$daysCount/counts-by-day';
     final response = await http.get(Uri.parse(url));
 
     if (response.statusCode == 200) {
@@ -60,7 +60,7 @@ class ScrobblesApi {
   }
 
   static Future<CountsByHourData> fetchCountsByHour(int daysCount) async {
-    final String url = baseUrl + '/data/' + daysCount.toString() + '/counts-by-hour';
+    final String url = '$baseUrl/data/$daysCount/counts-by-hour';
     final response = await http.get(Uri.parse(url));
 
     if (response.statusCode == 200) {
@@ -71,7 +71,7 @@ class ScrobblesApi {
   }
 
   static Future<DiscoveriesData> fetchDiscoveries(int daysCount) async {
-    final String url = baseUrl + '/data/' + daysCount.toString() + '/news';
+    final String url = '$baseUrl/data/$daysCount/news';
     final response = await http.get(Uri.parse(url));
 
     if (response.statusCode == 200) {
@@ -82,7 +82,7 @@ class ScrobblesApi {
   }
 
   static Future<TopArtistsData> fetchTopArtists(int daysCount) async {
-    final String url = baseUrl + '/data/' + daysCount.toString() + '/top-artists';
+    final String url = '$baseUrl/data/$daysCount/top-artists';
     final response = await http.get(Uri.parse(url));
 
     if (response.statusCode == 200) {
@@ -93,7 +93,7 @@ class ScrobblesApi {
   }
 
   static Future<HeatmapData> fetchHeatmap(int daysCount) async {
-    final String url = baseUrl + '/data/' + daysCount.toString() + '/heatmap';
+    final String url = '$baseUrl/data/$daysCount/heatmap';
     final response = await http.get(Uri.parse(url));
 
     if (response.statusCode == 200) {
@@ -104,7 +104,7 @@ class ScrobblesApi {
   }
 
   static Future<NewArtistsData> fetchNewArtists(int count) async {
-    final String url = baseUrl + '/data/discoveries/artists/' + count.toString();
+    final String url = '$baseUrl/data/discoveries/artists/$count';
     final response = await http.get(Uri.parse(url));
 
     if (response.statusCode == 200) {
@@ -115,7 +115,7 @@ class ScrobblesApi {
   }
 
   static Future<NewTracksData> fetchNewTracks(int count) async {
-    final String url = baseUrl + '/data/discoveries/tracks/' + count.toString();
+    final String url = '$baseUrl/data/discoveries/tracks/$count';
     final response = await http.get(Uri.parse(url));
 
     if (response.statusCode == 200) {
diff --git a/lib/ui/screens/discoveries.dart b/lib/ui/screens/discoveries.dart
index c30be6637b78d07536fe9747f953f49d247644d8..550307b8f3a37ca702a034cc49e05b628d936ab5 100644
--- a/lib/ui/screens/discoveries.dart
+++ b/lib/ui/screens/discoveries.dart
@@ -15,19 +15,19 @@ class ScreenDiscoveries extends StatelessWidget {
       color: Theme.of(context).colorScheme.background,
       child: RefreshIndicator(
         onRefresh: () async {
-          this.notifyParent();
+          notifyParent();
         },
         child: ListView(
           padding: const EdgeInsets.symmetric(horizontal: 4),
           physics: const BouncingScrollPhysics(),
-          children: <Widget>[
-            const SizedBox(height: 8),
-            const CardDiscoveries(),
-            const SizedBox(height: 6),
-            const CardNewArtists(),
-            const SizedBox(height: 6),
-            const CardNewTracks(),
-            const SizedBox(height: 36),
+          children: const <Widget>[
+            SizedBox(height: 8),
+            CardDiscoveries(),
+            SizedBox(height: 6),
+            CardNewArtists(),
+            SizedBox(height: 6),
+            CardNewTracks(),
+            SizedBox(height: 36),
           ],
         ),
       ),
diff --git a/lib/ui/screens/home.dart b/lib/ui/screens/home.dart
index 4960e2e3e2e5f67475cbc19f479b659a6aa50e8e..e943ff8ebbefe4f26626a728c1124f6b9e780f63 100644
--- a/lib/ui/screens/home.dart
+++ b/lib/ui/screens/home.dart
@@ -16,21 +16,21 @@ class ScreenHome extends StatelessWidget {
       color: Theme.of(context).colorScheme.background,
       child: RefreshIndicator(
         onRefresh: () async {
-          this.notifyParent();
+          notifyParent();
         },
         child: ListView(
           padding: const EdgeInsets.symmetric(horizontal: 4),
           physics: const BouncingScrollPhysics(),
-          children: <Widget>[
-            const SizedBox(height: 8),
-            const CardStatisticsGlobal(),
-            const SizedBox(height: 6),
-            const CardStatisticsRecent(),
-            const SizedBox(height: 6),
-            const CardTimeline(),
-            const SizedBox(height: 6),
-            const CardTopArtists(),
-            const SizedBox(height: 36),
+          children: const <Widget>[
+            SizedBox(height: 8),
+            CardStatisticsGlobal(),
+            SizedBox(height: 6),
+            CardStatisticsRecent(),
+            SizedBox(height: 6),
+            CardTimeline(),
+            SizedBox(height: 6),
+            CardTopArtists(),
+            SizedBox(height: 36),
           ],
         ),
       ),
diff --git a/lib/ui/screens/settings.dart b/lib/ui/screens/settings.dart
index 79851e7b98a3b6e1fe7669eedbd516779a5a2a6e..736f3a5fe35aaf7ec45686b01805000e21405f37 100644
--- a/lib/ui/screens/settings.dart
+++ b/lib/ui/screens/settings.dart
@@ -15,9 +15,9 @@ class ScreenSettings extends StatelessWidget {
         padding: const EdgeInsets.symmetric(horizontal: 4),
         physics: const BouncingScrollPhysics(),
         children: <Widget>[
-          SizedBox(height: 8),
+          const SizedBox(height: 8),
           AppTitle1(text: tr('settings_title')),
-          SettingsForm(),
+          const SettingsForm(),
         ],
       ),
     );
diff --git a/lib/ui/screens/statistics.dart b/lib/ui/screens/statistics.dart
index 69e8a38a1502bf38166a1501de9bcb4a1246fc95..7e35f1ec9905c382d0ed789cbd42217d692f7b85 100644
--- a/lib/ui/screens/statistics.dart
+++ b/lib/ui/screens/statistics.dart
@@ -15,19 +15,19 @@ class ScreenStatistics extends StatelessWidget {
       color: Theme.of(context).colorScheme.background,
       child: RefreshIndicator(
         onRefresh: () async {
-          this.notifyParent();
+          notifyParent();
         },
         child: ListView(
           padding: const EdgeInsets.symmetric(horizontal: 4),
           physics: const BouncingScrollPhysics(),
-          children: <Widget>[
-            const SizedBox(height: 8),
-            const CardHeatmap(),
-            const SizedBox(height: 6),
-            const CardCountsByDay(),
-            const SizedBox(height: 6),
-            const CardCountsByHour(),
-            const SizedBox(height: 36),
+          children: const <Widget>[
+            SizedBox(height: 8),
+            CardHeatmap(),
+            SizedBox(height: 6),
+            CardCountsByDay(),
+            SizedBox(height: 6),
+            CardCountsByHour(),
+            SizedBox(height: 36),
           ],
         ),
       ),
diff --git a/lib/ui/widgets/abstracts/custom_bar_chart.dart b/lib/ui/widgets/abstracts/custom_bar_chart.dart
index 9ca47dc578f4d469bd4e52d778999430a028ca6a..ebf9fe83969c21ee4d67cf1682f64d6bae1e6abd 100644
--- a/lib/ui/widgets/abstracts/custom_bar_chart.dart
+++ b/lib/ui/widgets/abstracts/custom_bar_chart.dart
@@ -10,7 +10,7 @@ class CustomBarChart extends CustomChart {
   @override
   Widget build(BuildContext context) {
     return SizedBox(
-      height: this.chartHeight,
+      height: chartHeight,
     );
   }
 
@@ -23,7 +23,7 @@ class CustomBarChart extends CustomChart {
         gridData: horizontalGridData,
         titlesData: getTitlesData(),
         barTouchData: BarTouchData(enabled: false),
-        maxY: getNextRoundNumber(getMaxCountsValue(), this.verticalTicksInterval),
+        maxY: getNextRoundNumber(getMaxCountsValue(), verticalTicksInterval),
       ),
     );
   }
@@ -45,7 +45,7 @@ class CustomBarChart extends CustomChart {
 
     return LinearGradient(
       begin: Alignment(-1, alignmentTopValue),
-      end: Alignment(1, 1),
+      end: const Alignment(1, 1),
       colors: <Color>[
         baseColor.lighten(30),
         baseColor,
@@ -66,7 +66,7 @@ class CustomBarChart extends CustomChart {
       double value = values[i];
       Color barColor = barColors[i];
 
-      final gradient = this.getGradient(barColor, value, this.getMaxCountsValue());
+      final gradient = getGradient(barColor, value, getMaxCountsValue());
       final borderColor = barColor.darken(20);
 
       barRods.add(
@@ -75,7 +75,7 @@ class CustomBarChart extends CustomChart {
           color: barColor,
           gradient: gradient,
           width: barWidth,
-          borderRadius: BorderRadius.all(Radius.zero),
+          borderRadius: const BorderRadius.all(Radius.zero),
           borderSide: BorderSide(
             color: borderColor,
           ),
@@ -89,14 +89,17 @@ class CustomBarChart extends CustomChart {
     );
   }
 
+  @override
   Widget getHorizontalTitlesWidget(double value, TitleMeta meta) {
     return getHorizontalTitlesWidgetWithDate(value, meta);
   }
 
+  @override
   Widget getVerticalLeftTitlesWidget(double value, TitleMeta meta) {
     return getVerticalTitlesWidgetWithValue(value, meta);
   }
 
+  @override
   Widget getVerticalRightTitlesWidget(double value, TitleMeta meta) {
     return getVerticalTitlesWidgetWithValue(value, meta);
   }
diff --git a/lib/ui/widgets/abstracts/custom_chart.dart b/lib/ui/widgets/abstracts/custom_chart.dart
index 04c5425a7b576c516f28152a70595de83428b4be..dd294c49c3bff8e9b10d69b936624a2fb64382de 100644
--- a/lib/ui/widgets/abstracts/custom_chart.dart
+++ b/lib/ui/widgets/abstracts/custom_chart.dart
@@ -15,7 +15,7 @@ class CustomChart extends StatelessWidget {
   @override
   Widget build(BuildContext context) {
     return SizedBox(
-      height: this.chartHeight,
+      height: chartHeight,
     );
   }
 
@@ -95,7 +95,7 @@ class CustomChart extends StatelessWidget {
   }
 
   FlTitlesData getTitlesData() {
-    const AxisTitles none = const AxisTitles(
+    const AxisTitles none = AxisTitles(
       sideTitles: SideTitles(showTitles: false),
     );
 
@@ -104,7 +104,7 @@ class CustomChart extends StatelessWidget {
         showTitles: true,
         reservedSize: 35,
         getTitlesWidget: getVerticalLeftTitlesWidget,
-        interval: this.verticalTicksInterval,
+        interval: verticalTicksInterval,
       ),
     );
 
@@ -113,7 +113,7 @@ class CustomChart extends StatelessWidget {
         showTitles: true,
         reservedSize: 35,
         getTitlesWidget: getVerticalRightTitlesWidget,
-        interval: this.verticalTicksInterval,
+        interval: verticalTicksInterval,
       ),
     );
 
@@ -135,15 +135,15 @@ class CustomChart extends StatelessWidget {
   }
 
   Widget getHorizontalTitlesWidget(double value, TitleMeta meta) {
-    return Text('');
+    return const Text('');
   }
 
   Widget getVerticalLeftTitlesWidget(double value, TitleMeta meta) {
-    return Text('');
+    return const Text('');
   }
 
   Widget getVerticalRightTitlesWidget(double value, TitleMeta meta) {
-    return Text('');
+    return const Text('');
   }
 
   Widget getHorizontalTitlesWidgetWithDate(double value, TitleMeta meta) {
@@ -156,14 +156,14 @@ class CustomChart extends StatelessWidget {
       axisSide: meta.axisSide,
       space: 4,
       child: Padding(
-        padding: EdgeInsets.only(right: 10),
+        padding: const EdgeInsets.only(right: 10),
         child: RotationTransition(
-          turns: new AlwaysStoppedAnimation(-30 / 360),
+          turns: const AlwaysStoppedAnimation(-30 / 360),
           child: Text(
             text,
             style: TextStyle(
               color: AppColors.mainTextColor1,
-              fontSize: this.titleFontSize,
+              fontSize: titleFontSize,
             ),
           ),
         ),
@@ -201,7 +201,7 @@ class CustomChart extends StatelessWidget {
         text,
         style: TextStyle(
           color: AppColors.mainTextColor1,
-          fontSize: this.titleFontSize,
+          fontSize: titleFontSize,
         ),
       ),
     );
@@ -211,13 +211,13 @@ class CustomChart extends StatelessWidget {
     return SideTitleWidget(
       axisSide: meta.axisSide,
       space: 4,
-      child: Text(''),
+      child: const Text(''),
     );
   }
 
   Widget getVerticalTitlesWidgetWithValue(double value, TitleMeta meta) {
     String suffix =
-        this.verticalAxisTitleSuffix != '' ? ' ' + this.verticalAxisTitleSuffix : '';
+        verticalAxisTitleSuffix != '' ? ' $verticalAxisTitleSuffix' : '';
 
     return SideTitleWidget(
       axisSide: meta.axisSide,
@@ -226,7 +226,7 @@ class CustomChart extends StatelessWidget {
         value.toInt().toString() + suffix,
         style: TextStyle(
           color: AppColors.mainTextColor1,
-          fontSize: this.titleFontSize,
+          fontSize: titleFontSize,
         ),
       ),
     );
diff --git a/lib/ui/widgets/abstracts/custom_line_chart.dart b/lib/ui/widgets/abstracts/custom_line_chart.dart
index 5bd3b96ddbcb333987921663d6c3c3bc673f7770..941b44472281cd6661cc6758cf32cac039a8c939 100644
--- a/lib/ui/widgets/abstracts/custom_line_chart.dart
+++ b/lib/ui/widgets/abstracts/custom_line_chart.dart
@@ -9,7 +9,7 @@ class CustomLineChart extends CustomChart {
   @override
   Widget build(BuildContext context) {
     return SizedBox(
-      height: this.chartHeight,
+      height: chartHeight,
     );
   }
 
@@ -17,7 +17,7 @@ class CustomLineChart extends CustomChart {
     double minDateAsDouble = double.maxFinite;
     double maxDateAsDouble = -double.maxFinite;
 
-    datesAsString.forEach((element) {
+    for (var element in datesAsString) {
       final double date = DateTime.parse(element).millisecondsSinceEpoch.toDouble();
 
       if (date < minDateAsDouble) {
@@ -26,7 +26,7 @@ class CustomLineChart extends CustomChart {
       if (date > maxDateAsDouble) {
         maxDateAsDouble = date;
       }
-    });
+    }
 
     return {
       'min': minDateAsDouble,
@@ -34,10 +34,12 @@ class CustomLineChart extends CustomChart {
     };
   }
 
+  @override
   Widget getVerticalLeftTitlesWidget(double value, TitleMeta meta) {
     return getVerticalTitlesWidgetWithValue(value, meta);
   }
 
+  @override
   Widget getVerticalRightTitlesWidget(double value, TitleMeta meta) {
     return getVerticalTitlesWidgetWithValue(value, meta);
   }
diff --git a/lib/ui/widgets/app_bar.dart b/lib/ui/widgets/app_bar.dart
index 1d9618a0ce950fe41c4e10a74f8ddc8ac1b62f54..cef615a27e52bce077d0d02ce5a0d00ce0692252 100644
--- a/lib/ui/widgets/app_bar.dart
+++ b/lib/ui/widgets/app_bar.dart
@@ -15,7 +15,7 @@ class StandardAppBar extends StatelessWidget implements PreferredSizeWidget {
       actions: [
         IconButton(
           onPressed: () {
-            this.notifyParent();
+            notifyParent();
           },
           icon: const Icon(UniconsSolid.refresh),
         ),
diff --git a/lib/ui/widgets/card_content.dart b/lib/ui/widgets/card_content.dart
index b69b7e891fe6b278cdb3fad8da187b79b1486123..0d222cebd72e957a122e9d4012ccd21be8dbb52a 100644
--- a/lib/ui/widgets/card_content.dart
+++ b/lib/ui/widgets/card_content.dart
@@ -20,7 +20,7 @@ class CardContent extends StatelessWidget {
     return Card(
       elevation: 2,
       shadowColor: Theme.of(context).colorScheme.shadow,
-      color: this.color,
+      color: color,
       shape: const RoundedRectangleBorder(
         borderRadius: BorderRadius.all(
           Radius.circular(8),
@@ -36,12 +36,12 @@ class CardContent extends StatelessWidget {
               crossAxisAlignment: CrossAxisAlignment.start,
               mainAxisAlignment: MainAxisAlignment.start,
               children: [
-                AppTitle1(text: this.title),
-                this.loader,
+                AppTitle1(text: title),
+                loader,
               ],
             ),
             const SizedBox(height: 8),
-            this.content,
+            content,
           ],
         ),
       ),
diff --git a/lib/ui/widgets/cards/counts_by_day.dart b/lib/ui/widgets/cards/counts_by_day.dart
index ad1c3d143e0ed89a0ca42c123002af9b1e7c2219..5ece893b43f5d5bff5a8ca7f405fad109f7d2956 100644
--- a/lib/ui/widgets/cards/counts_by_day.dart
+++ b/lib/ui/widgets/cards/counts_by_day.dart
@@ -38,8 +38,8 @@ class CardCountsByDay extends StatelessWidget {
   }
 
   Widget update(int daysCount) {
-    final Widget loading = const Text('⏳');
-    final Widget done = const Text('');
+    const Widget loading = Text('⏳');
+    const Widget done = Text('');
 
     late Future<CountsByDayData> future = ScrobblesApi.fetchCountsByDay(daysCount);
 
diff --git a/lib/ui/widgets/cards/counts_by_hour.dart b/lib/ui/widgets/cards/counts_by_hour.dart
index 3bfc614305a2a9cf174bb5cc9e9b79ad98bd8170..f45c0537372b058120831f0c25653663859f8279 100644
--- a/lib/ui/widgets/cards/counts_by_hour.dart
+++ b/lib/ui/widgets/cards/counts_by_hour.dart
@@ -38,8 +38,8 @@ class CardCountsByHour extends StatelessWidget {
   }
 
   Widget update(int daysCount) {
-    final Widget loading = const Text('⏳');
-    final Widget done = const Text('');
+    const Widget loading = Text('⏳');
+    const Widget done = Text('');
 
     late Future<CountsByHourData> future = ScrobblesApi.fetchCountsByHour(daysCount);
 
diff --git a/lib/ui/widgets/cards/discoveries.dart b/lib/ui/widgets/cards/discoveries.dart
index e136131536f67545c537c4c1e5464b043284913d..415a68f11330741d0303d87ec56dcfb22fdeded1 100644
--- a/lib/ui/widgets/cards/discoveries.dart
+++ b/lib/ui/widgets/cards/discoveries.dart
@@ -59,8 +59,8 @@ class CardDiscoveries extends StatelessWidget {
   }
 
   Widget update(int daysCount) {
-    final Widget loading = const Text('⏳');
-    final Widget done = const Text('');
+    const Widget loading = Text('⏳');
+    const Widget done = Text('');
 
     late Future<DiscoveriesData> future = ScrobblesApi.fetchDiscoveries(daysCount);
 
diff --git a/lib/ui/widgets/cards/heatmap.dart b/lib/ui/widgets/cards/heatmap.dart
index 485058dee9684e02dc225ba0bf0fec7b7262d251..11dc86931ad7c84156c63aa5b0763de317ee8700 100644
--- a/lib/ui/widgets/cards/heatmap.dart
+++ b/lib/ui/widgets/cards/heatmap.dart
@@ -38,8 +38,8 @@ class CardHeatmap extends StatelessWidget {
   }
 
   Widget update(int daysCount) {
-    final Widget loading = const Text('⏳');
-    final Widget done = const Text('');
+    const Widget loading = Text('⏳');
+    const Widget done = Text('');
 
     late Future<HeatmapData> future = ScrobblesApi.fetchHeatmap(daysCount);
 
diff --git a/lib/ui/widgets/cards/new_artists.dart b/lib/ui/widgets/cards/new_artists.dart
index 432aa83c4ccdde0d3725615477750bbe54c625fc..be377fe4ed84e4af9daf5c66140e177e5d2eab60 100644
--- a/lib/ui/widgets/cards/new_artists.dart
+++ b/lib/ui/widgets/cards/new_artists.dart
@@ -38,8 +38,8 @@ class CardNewArtists extends StatelessWidget {
   }
 
   Widget update(int count) {
-    final Widget loading = const Text('⏳');
-    final Widget done = const Text('');
+    const Widget loading = Text('⏳');
+    const Widget done = Text('');
 
     late Future<NewArtistsData> future = ScrobblesApi.fetchNewArtists(count);
 
diff --git a/lib/ui/widgets/cards/new_tracks.dart b/lib/ui/widgets/cards/new_tracks.dart
index fd1dff5719f4bd5b18d289868daee0cae157bb0c..4787dbfe4ca6ea8f8f46d2973da438df5c4207e4 100644
--- a/lib/ui/widgets/cards/new_tracks.dart
+++ b/lib/ui/widgets/cards/new_tracks.dart
@@ -28,9 +28,7 @@ class CardNewTracks extends StatelessWidget {
             mainAxisAlignment: MainAxisAlignment.start,
             crossAxisAlignment: CrossAxisAlignment.start,
             children: data.newTracks?.data
-                    .map((newTrack) => Text((newTrack.track?.artist.name ?? '') +
-                        ' - ' +
-                        (newTrack.track?.name ?? '')))
+                    .map((newTrack) => Text('${newTrack.track?.artist.name ?? ''} - ${newTrack.track?.name ?? ''}'))
                     .toList() ??
                 [],
           ),
@@ -40,8 +38,8 @@ class CardNewTracks extends StatelessWidget {
   }
 
   Widget update(int count) {
-    final Widget loading = const Text('⏳');
-    final Widget done = const Text('');
+    const Widget loading = Text('⏳');
+    const Widget done = Text('');
 
     late Future<NewTracksData> future = ScrobblesApi.fetchNewTracks(count);
 
diff --git a/lib/ui/widgets/cards/statistics_global.dart b/lib/ui/widgets/cards/statistics_global.dart
index 2d7351d1be95c0d916f57dc93f7c51b0b7000a95..6477d3d9917ededd8b0e1a49178a9609b039e63e 100644
--- a/lib/ui/widgets/cards/statistics_global.dart
+++ b/lib/ui/widgets/cards/statistics_global.dart
@@ -30,8 +30,8 @@ class CardStatisticsGlobal extends StatelessWidget {
   }
 
   Widget update() {
-    final Widget loading = const Text('⏳');
-    final Widget done = const Text('');
+    const Widget loading = Text('⏳');
+    const Widget done = Text('');
 
     late Future<StatisticsGlobalData> future = ScrobblesApi.fetchGlobalStatistics();
 
diff --git a/lib/ui/widgets/cards/statistics_recent.dart b/lib/ui/widgets/cards/statistics_recent.dart
index 044ce9191acefb6f54fd6993c86d6cabd1bdda64..1ef1aa20f3e327459e8fd011562d7ac823a852c9 100644
--- a/lib/ui/widgets/cards/statistics_recent.dart
+++ b/lib/ui/widgets/cards/statistics_recent.dart
@@ -39,8 +39,8 @@ class CardStatisticsRecent extends StatelessWidget {
   }
 
   Widget update(int daysCount) {
-    final Widget loading = const Text('⏳');
-    final Widget done = const Text('');
+    const Widget loading = Text('⏳');
+    const Widget done = Text('');
 
     late Future<StatisticsRecentData> future = ScrobblesApi.fetchRecentStatistics(daysCount);
 
diff --git a/lib/ui/widgets/cards/timeline.dart b/lib/ui/widgets/cards/timeline.dart
index f343b316f09591da2cfd27990c6670abd82825fa..8e551bf0544f4edba8e8f7c0d3e424cdbe40e73c 100644
--- a/lib/ui/widgets/cards/timeline.dart
+++ b/lib/ui/widgets/cards/timeline.dart
@@ -44,8 +44,8 @@ class CardTimeline extends StatelessWidget {
   }
 
   Widget update(int daysCount) {
-    final Widget loading = const Text('⏳');
-    final Widget done = const Text('');
+    const Widget loading = Text('⏳');
+    const Widget done = Text('');
 
     late Future<TimelineData> future = ScrobblesApi.fetchTimeline(daysCount);
 
diff --git a/lib/ui/widgets/cards/top_artists.dart b/lib/ui/widgets/cards/top_artists.dart
index ff6a5035a212f61384c940a60e95bf027a6ff537..2830bfa8c3c4903f3d12a34c87866aa9de241c3b 100644
--- a/lib/ui/widgets/cards/top_artists.dart
+++ b/lib/ui/widgets/cards/top_artists.dart
@@ -47,8 +47,8 @@ class CardTopArtists extends StatelessWidget {
   }
 
   Widget update(int daysCount) {
-    final Widget loading = const Text('⏳');
-    final Widget done = const Text('');
+    const Widget loading = Text('⏳');
+    const Widget done = Text('');
 
     late Future<TopArtistsData> future = ScrobblesApi.fetchTopArtists(daysCount);
 
diff --git a/lib/ui/widgets/charts/counts_by_day.dart b/lib/ui/widgets/charts/counts_by_day.dart
index b54be919b53324313c7cefb15d2370df5399fb12..ebded1d870dff751f0c7a4d35ca87e6e115e1147 100644
--- a/lib/ui/widgets/charts/counts_by_day.dart
+++ b/lib/ui/widgets/charts/counts_by_day.dart
@@ -9,26 +9,28 @@ class ChartCountsByDay extends CustomBarChart {
 
   const ChartCountsByDay({super.key, required this.chartData});
 
+  @override
   final double verticalTicksInterval = 5;
+  @override
   final String verticalAxisTitleSuffix = '%';
 
   @override
   Widget build(BuildContext context) {
-    if (this.chartData.data.keys.length == 0) {
+    if (chartData.data.keys.isEmpty) {
       return SizedBox(
-        height: this.chartHeight,
+        height: chartHeight,
       );
     }
 
-    return Container(
-      height: this.chartHeight,
+    return SizedBox(
+      height: chartHeight,
       child: LayoutBuilder(
         builder: (context, constraints) {
           final double maxWidth = constraints.maxWidth;
-          final int barsCount = this.chartData.data.keys.length;
+          final int barsCount = chartData.data.keys.length;
 
           return getBarChart(
-            barWidth: this.getBarWidth(maxWidth, barsCount),
+            barWidth: getBarWidth(maxWidth, barsCount),
             backgroundColor: Theme.of(context).colorScheme.onSurface,
           );
         },
@@ -36,17 +38,18 @@ class ChartCountsByDay extends CustomBarChart {
     );
   }
 
+  @override
   double getMaxCountsValue() {
     double maxValue = 0;
 
-    this.chartData.data.keys.forEach((key) {
-      double? counts = this.chartData.data[key];
+    for (var key in chartData.data.keys) {
+      double? counts = chartData.data[key];
       if (counts != null) {
         if (counts > maxValue) {
           maxValue = counts;
         }
       }
-    });
+    }
 
     return maxValue;
   }
@@ -55,52 +58,54 @@ class ChartCountsByDay extends CustomBarChart {
     Color barColor = Colors.black;
     switch (dayIndex) {
       case 1:
-        barColor = Color.fromARGB(255, 255, 99, 132);
+        barColor = const Color.fromARGB(255, 255, 99, 132);
         break;
       case 2:
-        barColor = Color.fromARGB(255, 255, 159, 64);
+        barColor = const Color.fromARGB(255, 255, 159, 64);
         break;
       case 3:
-        barColor = Color.fromARGB(255, 255, 205, 86);
+        barColor = const Color.fromARGB(255, 255, 205, 86);
         break;
       case 4:
-        barColor = Color.fromARGB(255, 75, 192, 192);
+        barColor = const Color.fromARGB(255, 75, 192, 192);
         break;
       case 5:
-        barColor = Color.fromARGB(255, 54, 162, 235);
+        barColor = const Color.fromARGB(255, 54, 162, 235);
         break;
       case 6:
-        barColor = Color.fromARGB(255, 153, 102, 255);
+        barColor = const Color.fromARGB(255, 153, 102, 255);
         break;
       case 7:
-        barColor = Color.fromARGB(255, 201, 203, 207);
+        barColor = const Color.fromARGB(255, 201, 203, 207);
         break;
       default:
     }
     return barColor;
   }
 
+  @override
   List<BarChartGroupData> getDataCounts(double barWidth) {
     List<BarChartGroupData> data = [];
 
-    this.chartData.data.keys.forEach((day) {
-      final double? counts = this.chartData.data[day];
+    for (var day in chartData.data.keys) {
+      final double? counts = chartData.data[day];
 
       if (counts != null) {
-        final Color barColor = this.getColorFromDayIndex(day);
+        final Color barColor = getColorFromDayIndex(day);
 
-        data.add(this.getBarItem(
+        data.add(getBarItem(
           x: day,
           values: [counts],
           barColors: [barColor],
           barWidth: barWidth,
         ));
       }
-    });
+    }
 
     return data;
   }
 
+  @override
   Widget getHorizontalTitlesWidget(double value, TitleMeta meta) {
     return getHorizontalTitlesWidgetWithDay(value, meta);
   }
diff --git a/lib/ui/widgets/charts/counts_by_hour.dart b/lib/ui/widgets/charts/counts_by_hour.dart
index 73feb7ec6f2291f4b1c81e68fa44c2411be274ce..fc423899f5902add58883cd63e441124aa007567 100644
--- a/lib/ui/widgets/charts/counts_by_hour.dart
+++ b/lib/ui/widgets/charts/counts_by_hour.dart
@@ -11,26 +11,28 @@ class ChartCountsByHour extends CustomBarChart {
 
   const ChartCountsByHour({super.key, required this.chartData});
 
+  @override
   final double verticalTicksInterval = 5;
+  @override
   final String verticalAxisTitleSuffix = '%';
 
   @override
   Widget build(BuildContext context) {
-    if (this.chartData.data.keys.length == 0) {
+    if (chartData.data.keys.isEmpty) {
       return SizedBox(
-        height: this.chartHeight,
+        height: chartHeight,
       );
     }
 
-    return Container(
-      height: this.chartHeight,
+    return SizedBox(
+      height: chartHeight,
       child: LayoutBuilder(
         builder: (context, constraints) {
           final double maxWidth = constraints.maxWidth;
-          final int barsCount = this.chartData.data.keys.length;
+          final int barsCount = chartData.data.keys.length;
 
           return getBarChart(
-            barWidth: this.getBarWidth(maxWidth, barsCount),
+            barWidth: getBarWidth(maxWidth, barsCount),
             backgroundColor: Theme.of(context).colorScheme.onSurface,
           );
         },
@@ -38,28 +40,30 @@ class ChartCountsByHour extends CustomBarChart {
     );
   }
 
+  @override
   double getMaxCountsValue() {
     double maxValue = 0;
 
-    this.chartData.data.keys.forEach((key) {
-      double? counts = this.chartData.data[key];
+    for (var key in chartData.data.keys) {
+      double? counts = chartData.data[key];
       if (counts != null) {
         if (counts > maxValue) {
           maxValue = counts;
         }
       }
-    });
+    }
 
     return maxValue;
   }
 
+  @override
   List<BarChartGroupData> getDataCounts(double barWidth) {
     List<BarChartGroupData> data = [];
 
     final barColor = AppColors.contentColorCyan.darken(30);
 
-    this.chartData.data.keys.forEach((day) {
-      final double? counts = this.chartData.data[day];
+    for (var day in chartData.data.keys) {
+      final double? counts = chartData.data[day];
 
       if (counts != null) {
         data.add(getBarItem(
@@ -69,11 +73,12 @@ class ChartCountsByHour extends CustomBarChart {
           barWidth: barWidth,
         ));
       }
-    });
+    }
 
     return data;
   }
 
+  @override
   Widget getHorizontalTitlesWidget(double value, TitleMeta meta) {
     return getHorizontalTitlesWidgetWithHour(value, meta);
   }
diff --git a/lib/ui/widgets/charts/discoveries_artists.dart b/lib/ui/widgets/charts/discoveries_artists.dart
index e3994f5dcf4bb107378eb3787279426947d3b169..d5c9bd315b6674d7be6e4ddb804b0e61256d412f 100644
--- a/lib/ui/widgets/charts/discoveries_artists.dart
+++ b/lib/ui/widgets/charts/discoveries_artists.dart
@@ -13,21 +13,21 @@ class ChartDiscoveriesArtists extends CustomBarChart {
 
   @override
   Widget build(BuildContext context) {
-    if (this.chartData.data.keys.length == 0) {
+    if (chartData.data.keys.isEmpty) {
       return SizedBox(
-        height: this.chartHeight,
+        height: chartHeight,
       );
     }
 
-    return Container(
-      height: this.chartHeight,
+    return SizedBox(
+      height: chartHeight,
       child: LayoutBuilder(
         builder: (context, constraints) {
           final double maxWidth = constraints.maxWidth;
-          final int barsCount = this.chartData.data.keys.length;
+          final int barsCount = chartData.data.keys.length;
 
           return getBarChart(
-            barWidth: this.getBarWidth(maxWidth, barsCount),
+            barWidth: getBarWidth(maxWidth, barsCount),
             backgroundColor: Theme.of(context).colorScheme.onSurface,
           );
         },
@@ -35,11 +35,12 @@ class ChartDiscoveriesArtists extends CustomBarChart {
     );
   }
 
+  @override
   double getMaxCountsValue() {
     double maxValue = 0;
 
-    this.chartData.data.keys.forEach((key) {
-      DiscoveriesDataValue? value = this.chartData.data[key];
+    for (var key in chartData.data.keys) {
+      DiscoveriesDataValue? value = chartData.data[key];
       if (value != null) {
         double newArtistsCount = value.newArtistsCount.toDouble();
 
@@ -47,22 +48,23 @@ class ChartDiscoveriesArtists extends CustomBarChart {
           maxValue = newArtistsCount;
         }
       }
-    });
+    }
 
     return maxValue;
   }
 
+  @override
   List<BarChartGroupData> getDataCounts(double barWidth) {
     List<BarChartGroupData> data = [];
 
     final newArtistsBarColor = AppColors.contentColorGreen.darken(20);
 
-    this.chartData.data.keys.forEach((key) {
-      DiscoveriesDataValue? value = this.chartData.data[key];
+    for (var key in chartData.data.keys) {
+      DiscoveriesDataValue? value = chartData.data[key];
       if (value != null) {
         final int date = DateTime.parse(key).millisecondsSinceEpoch;
 
-        data.add(this.getBarItem(
+        data.add(getBarItem(
           x: date,
           values: [
             value.newArtistsCount.toDouble(),
@@ -73,7 +75,7 @@ class ChartDiscoveriesArtists extends CustomBarChart {
           barWidth: barWidth,
         ));
       }
-    });
+    }
 
     return data;
   }
diff --git a/lib/ui/widgets/charts/discoveries_tracks.dart b/lib/ui/widgets/charts/discoveries_tracks.dart
index 2436fcf07e46beea6284b87c5af6db0f70e29dae..9272e825baf60ad36daf2b77ad69bbb2a6f1c7e8 100644
--- a/lib/ui/widgets/charts/discoveries_tracks.dart
+++ b/lib/ui/widgets/charts/discoveries_tracks.dart
@@ -13,21 +13,21 @@ class ChartDiscoveriesTracks extends CustomBarChart {
 
   @override
   Widget build(BuildContext context) {
-    if (this.chartData.data.keys.length == 0) {
+    if (chartData.data.keys.isEmpty) {
       return SizedBox(
-        height: this.chartHeight,
+        height: chartHeight,
       );
     }
 
-    return Container(
-      height: this.chartHeight,
+    return SizedBox(
+      height: chartHeight,
       child: LayoutBuilder(
         builder: (context, constraints) {
           final double maxWidth = constraints.maxWidth;
-          final int barsCount = this.chartData.data.keys.length;
+          final int barsCount = chartData.data.keys.length;
 
           return getBarChart(
-            barWidth: this.getBarWidth(maxWidth, barsCount),
+            barWidth: getBarWidth(maxWidth, barsCount),
             backgroundColor: Theme.of(context).colorScheme.onSurface,
           );
         },
@@ -35,11 +35,12 @@ class ChartDiscoveriesTracks extends CustomBarChart {
     );
   }
 
+  @override
   double getMaxCountsValue() {
     double maxValue = 0;
 
-    this.chartData.data.keys.forEach((key) {
-      DiscoveriesDataValue? value = this.chartData.data[key];
+    for (var key in chartData.data.keys) {
+      DiscoveriesDataValue? value = chartData.data[key];
       if (value != null) {
         double newTracksCount = value.newTracksCount.toDouble();
 
@@ -47,22 +48,23 @@ class ChartDiscoveriesTracks extends CustomBarChart {
           maxValue = newTracksCount;
         }
       }
-    });
+    }
 
     return maxValue;
   }
 
+  @override
   List<BarChartGroupData> getDataCounts(double barWidth) {
     List<BarChartGroupData> data = [];
 
     final newTracksBarColor = AppColors.contentColorBlue.darken(20);
 
-    this.chartData.data.keys.forEach((key) {
-      DiscoveriesDataValue? value = this.chartData.data[key];
+    for (var key in chartData.data.keys) {
+      DiscoveriesDataValue? value = chartData.data[key];
       if (value != null) {
         final int date = DateTime.parse(key).millisecondsSinceEpoch;
 
-        data.add(this.getBarItem(
+        data.add(getBarItem(
           x: date,
           values: [
             value.newTracksCount.toDouble(),
@@ -73,7 +75,7 @@ class ChartDiscoveriesTracks extends CustomBarChart {
           barWidth: barWidth,
         ));
       }
-    });
+    }
 
     return data;
   }
diff --git a/lib/ui/widgets/charts/heatmap.dart b/lib/ui/widgets/charts/heatmap.dart
index b274fc2853694c255b1c4bdf8bf5ec4189888b73..3867053c6d08049d9601da9983e1529e690f1461 100644
--- a/lib/ui/widgets/charts/heatmap.dart
+++ b/lib/ui/widgets/charts/heatmap.dart
@@ -5,14 +5,15 @@ import 'package:flutter/material.dart';
 import 'package:scrobbles/config/app_colors.dart';
 import 'package:scrobbles/models/heatmap.dart';
 import 'package:scrobbles/ui/widgets/abstracts/custom_chart.dart';
-import 'package:scrobbles/utils/color_extensions.dart';
 
 class ChartHeatmap extends CustomChart {
   final HeatmapData chartData;
 
   const ChartHeatmap({super.key, required this.chartData});
 
+  @override
   final double chartHeight = 150.0;
+  @override
   final double titleFontSize = 9;
   final Color baseColor = AppColors.contentColorPink;
   final double scale = 8.0;
@@ -20,9 +21,9 @@ class ChartHeatmap extends CustomChart {
 
   @override
   Widget build(BuildContext context) {
-    if (this.chartData.data.keys.length == 0) {
+    if (chartData.data.keys.isEmpty) {
       return SizedBox(
-        height: this.chartHeight,
+        height: chartHeight,
       );
     }
 
@@ -36,7 +37,7 @@ class ChartHeatmap extends CustomChart {
           minY: 0,
           maxY: 7,
           borderData: FlBorderData(show: false),
-          gridData: FlGridData(show: false),
+          gridData: const FlGridData(show: false),
           titlesData: getTitlesData(),
           scatterTouchData: ScatterTouchData(enabled: false),
         ),
@@ -54,7 +55,7 @@ class ChartHeatmap extends CustomChart {
   int getMaxCount() {
     int maxValue = 0;
 
-    this.chartData.data.forEach((day, hours) {
+    chartData.data.forEach((day, hours) {
       hours.forEach((hour, count) {
         if (count > maxValue) {
           maxValue = count;
@@ -70,7 +71,7 @@ class ChartHeatmap extends CustomChart {
 
     final int maxCount = getMaxCount();
 
-    this.chartData.data.forEach((day, hours) {
+    chartData.data.forEach((day, hours) {
       hours.forEach((hour, count) {
         double normalizedValue = count / maxCount;
 
@@ -89,8 +90,9 @@ class ChartHeatmap extends CustomChart {
     return spots;
   }
 
+  @override
   FlTitlesData getTitlesData() {
-    const AxisTitles none = const AxisTitles(
+    const AxisTitles none = AxisTitles(
       sideTitles: SideTitles(showTitles: false),
     );
 
@@ -121,6 +123,7 @@ class ChartHeatmap extends CustomChart {
     );
   }
 
+  @override
   Widget getVerticalTitlesWidgetWithValue(double value, TitleMeta meta) {
     final String dayShortName = getDayShortName(8 - value.toInt());
 
@@ -131,7 +134,7 @@ class ChartHeatmap extends CustomChart {
         tr(dayShortName),
         style: TextStyle(
           color: AppColors.mainTextColor1,
-          fontSize: this.titleFontSize,
+          fontSize: titleFontSize,
         ),
       ),
     );
diff --git a/lib/ui/widgets/charts/timeline_counts.dart b/lib/ui/widgets/charts/timeline_counts.dart
index 5d57f50d1091dec2bb994c21e4ce5d171132a9da..39fa5ac72681889951d0f2f8d1ee1d15532aff7c 100644
--- a/lib/ui/widgets/charts/timeline_counts.dart
+++ b/lib/ui/widgets/charts/timeline_counts.dart
@@ -10,25 +10,26 @@ class ChartTimelineCounts extends CustomBarChart {
 
   const ChartTimelineCounts({super.key, required this.chartData});
 
+  @override
   final double verticalTicksInterval = 50;
 
   @override
   Widget build(BuildContext context) {
-    if (this.chartData.data.keys.length == 0) {
+    if (chartData.data.keys.isEmpty) {
       return SizedBox(
-        height: this.chartHeight,
+        height: chartHeight,
       );
     }
 
-    return Container(
-      height: this.chartHeight,
+    return SizedBox(
+      height: chartHeight,
       child: LayoutBuilder(
         builder: (context, constraints) {
           final double maxWidth = constraints.maxWidth;
-          final int barsCount = this.chartData.data.keys.length;
+          final int barsCount = chartData.data.keys.length;
 
           return getBarChart(
-            barWidth: this.getBarWidth(maxWidth, barsCount),
+            barWidth: getBarWidth(maxWidth, barsCount),
             backgroundColor: Theme.of(context).colorScheme.onSurface,
           );
         },
@@ -36,45 +37,48 @@ class ChartTimelineCounts extends CustomBarChart {
     );
   }
 
+  @override
   double getMaxCountsValue() {
     double maxValue = 0;
 
-    this.chartData.data.keys.forEach((key) {
-      TimelineDataValue? value = this.chartData.data[key];
+    for (var key in chartData.data.keys) {
+      TimelineDataValue? value = chartData.data[key];
       if (value != null) {
         double counts = value.counts.toDouble();
         if (counts > maxValue) {
           maxValue = counts;
         }
       }
-    });
+    }
 
     return maxValue;
   }
 
+  @override
   List<BarChartGroupData> getDataCounts(double barWidth) {
     List<BarChartGroupData> data = [];
 
-    final barColor = AppColors.contentColorOrange;
+    const barColor = AppColors.contentColorOrange;
 
-    this.chartData.data.keys.forEach((key) {
-      TimelineDataValue? value = this.chartData.data[key];
+    for (var key in chartData.data.keys) {
+      TimelineDataValue? value = chartData.data[key];
       if (value != null) {
         final int date = DateTime.parse(key).millisecondsSinceEpoch;
         final double counts = value.counts.toDouble();
 
-        data.add(this.getBarItem(
+        data.add(getBarItem(
           x: date,
           values: [counts],
           barColors: [barColor],
           barWidth: barWidth,
         ));
       }
-    });
+    }
 
     return data;
   }
 
+  @override
   Widget getVerticalLeftTitlesWidget(double value, TitleMeta meta) {
     return getVerticalTitlesSpacerWidget(value, meta);
   }
diff --git a/lib/ui/widgets/charts/timeline_eclecticism.dart b/lib/ui/widgets/charts/timeline_eclecticism.dart
index 56f05aab19672a1d2f7fcd5e1b1093a2c8c995cb..d3c8f201a269669327dc801388bb73b84bf5f1f9 100644
--- a/lib/ui/widgets/charts/timeline_eclecticism.dart
+++ b/lib/ui/widgets/charts/timeline_eclecticism.dart
@@ -11,23 +11,24 @@ class ChartTimelineEclecticism extends CustomLineChart {
 
   const ChartTimelineEclecticism({super.key, required this.chartData});
 
+  @override
   final String verticalAxisTitleSuffix = '%';
 
   @override
   Widget build(BuildContext context) {
-    if (this.chartData.data.keys.length == 0) {
+    if (chartData.data.keys.isEmpty) {
       return SizedBox(
-        height: this.chartHeight,
+        height: chartHeight,
       );
     }
 
-    final horizontalScale = getHorizontalScaleFromDates(this.chartData.data.keys);
+    final horizontalScale = getHorizontalScaleFromDates(chartData.data.keys);
 
     // Left/right margins: 12h, in milliseconds
     const double margin = 12 * 60 * 60 * 1000;
 
-    return Container(
-      height: this.chartHeight,
+    return SizedBox(
+      height: chartHeight,
       child: LineChart(
         LineChartData(
           lineBarsData: getDataEclecticism(),
@@ -48,17 +49,17 @@ class ChartTimelineEclecticism extends CustomLineChart {
   List<LineChartBarData> getDataEclecticism() {
     List<FlSpot> spots = [];
 
-    this.chartData.data.keys.forEach((element) {
-      TimelineDataValue? value = this.chartData.data[element];
+    for (var element in chartData.data.keys) {
+      TimelineDataValue? value = chartData.data[element];
       if (value != null) {
         final double date = DateTime.parse(element).millisecondsSinceEpoch.toDouble();
         final double eclecticism = value.eclecticism.toDouble();
 
         spots.add(FlSpot(date, eclecticism));
       }
-    });
+    }
 
-    final baseColor = AppColors.contentColorCyan;
+    const baseColor = AppColors.contentColorCyan;
     final borderColor = baseColor.darken(20);
 
     return [
@@ -73,6 +74,7 @@ class ChartTimelineEclecticism extends CustomLineChart {
     ];
   }
 
+  @override
   Widget getVerticalRightTitlesWidget(double value, TitleMeta meta) {
     return getVerticalTitlesSpacerWidget(value, meta);
   }
diff --git a/lib/ui/widgets/charts/top_artists.dart b/lib/ui/widgets/charts/top_artists.dart
index bf380ee804916e37b145f7698859121b30b9b77e..369be995eee4b41f7a80c0ad4b6351ed88e41f8f 100644
--- a/lib/ui/widgets/charts/top_artists.dart
+++ b/lib/ui/widgets/charts/top_artists.dart
@@ -54,7 +54,7 @@ class ChartTopArtists extends CustomChart {
 
     int index = 0;
 
-    this.chartData.topArtists.forEach((element) {
+    for (var element in chartData.topArtists) {
       final Color baseColor = getColorFromIndex(index++);
 
       final PieChartSectionData item = PieChartSectionData(
@@ -74,7 +74,7 @@ class ChartTopArtists extends CustomChart {
       );
 
       items.add(item);
-    });
+    }
 
     return items;
   }
@@ -85,7 +85,7 @@ class ChartTopArtists extends CustomChart {
     List<Widget> items = [];
     int index = 0;
 
-    this.chartData.topArtists.forEach((element) {
+    for (var element in chartData.topArtists) {
       final Color baseColor = getColorFromIndex(index++);
 
       final Widget item = Row(
@@ -104,8 +104,8 @@ class ChartTopArtists extends CustomChart {
           ),
           const SizedBox(width: 4),
           Text(
-            element.artistName + ' (' + element.count.toString() + ')',
-            style: TextStyle(
+            '${element.artistName} (${element.count})',
+            style: const TextStyle(
               fontSize: itemSize - 2,
               fontWeight: FontWeight.bold,
             ),
@@ -114,7 +114,7 @@ class ChartTopArtists extends CustomChart {
       );
 
       items.add(item);
-    });
+    }
 
     return Column(
       mainAxisAlignment: MainAxisAlignment.start,
diff --git a/lib/ui/widgets/charts/top_artists_stream.dart b/lib/ui/widgets/charts/top_artists_stream.dart
index 6a01a6268cff268c9651eb123cfcfd341b07afbe..738cc6d9b089a1fdcf73dc224ada86a3126d9e36 100644
--- a/lib/ui/widgets/charts/top_artists_stream.dart
+++ b/lib/ui/widgets/charts/top_artists_stream.dart
@@ -10,21 +10,23 @@ class ChartTopArtistsStream extends CustomLineChart {
 
   const ChartTopArtistsStream({super.key, required this.chartData});
 
+  @override
   final double verticalTicksInterval = 10;
+  @override
   final String verticalAxisTitleSuffix = '%';
 
   @override
   Widget build(BuildContext context) {
-    if (this.chartData.topArtistsStream.keys.isEmpty) {
+    if (chartData.topArtistsStream.keys.isEmpty) {
       return SizedBox(
-        height: this.chartHeight,
+        height: chartHeight,
       );
     }
 
-    final horizontalScale = getHorizontalScaleFromDates(this.chartData.topArtistsStream.keys);
+    final horizontalScale = getHorizontalScaleFromDates(chartData.topArtistsStream.keys);
 
-    return Container(
-      height: this.chartHeight,
+    return SizedBox(
+      height: chartHeight,
       child: LineChart(
         LineChartData(
           lineBarsData: getDataStreamLine(),
@@ -35,7 +37,7 @@ class ChartTopArtistsStream extends CustomLineChart {
           lineTouchData: const LineTouchData(enabled: false),
           minX: horizontalScale['min'],
           maxX: horizontalScale['max'],
-          maxY: getNextRoundNumber(getMaxVerticalValue(), this.verticalTicksInterval),
+          maxY: getNextRoundNumber(getMaxVerticalValue(), verticalTicksInterval),
           minY: 0,
         ),
         duration: const Duration(milliseconds: 250),
@@ -46,27 +48,27 @@ class ChartTopArtistsStream extends CustomLineChart {
   double getMaxVerticalValue() {
     double maxValue = 0;
 
-    this.chartData.topArtistsStream.keys.forEach((dateAsString) {
+    for (var dateAsString in chartData.topArtistsStream.keys) {
       double totalValue = 0.0;
       final List<TopArtistsStreamDataValue> artists =
-          this.chartData.topArtistsStream[dateAsString] ?? [];
+          chartData.topArtistsStream[dateAsString] ?? [];
 
-      artists.forEach((artist) {
+      for (var artist in artists) {
         final double value = artist.value;
         totalValue = totalValue + value;
-      });
+      }
 
       if (totalValue > maxValue) {
         maxValue = totalValue;
       }
-    });
+    }
 
     return maxValue;
   }
 
   List<LineChartBarData> getDataStreamLine() {
     final int artistsCount =
-        this.chartData.topArtistsStream[this.chartData.topArtistsStream.keys.first]?.length ??
+        chartData.topArtistsStream[chartData.topArtistsStream.keys.first]?.length ??
             0;
 
     List<LineChartBarData> lines = [];
@@ -77,10 +79,10 @@ class ChartTopArtistsStream extends CustomLineChart {
 
       List<FlSpot> spots = [];
 
-      this.chartData.topArtistsStream.keys.forEach((dateAsString) {
+      for (var dateAsString in chartData.topArtistsStream.keys) {
         final double date = DateTime.parse(dateAsString).millisecondsSinceEpoch.toDouble();
         spots.add(FlSpot(date, 0));
-      });
+      }
 
       return LineChartBarData(
         color: borderColor,
@@ -98,11 +100,11 @@ class ChartTopArtistsStream extends CustomLineChart {
 
       List<FlSpot> spots = [];
 
-      this.chartData.topArtistsStream.keys.forEach((dateAsString) {
+      for (var dateAsString in chartData.topArtistsStream.keys) {
         final double date = DateTime.parse(dateAsString).millisecondsSinceEpoch.toDouble();
 
         List<TopArtistsStreamDataValue> artists =
-            this.chartData.topArtistsStream[dateAsString] ?? [];
+            chartData.topArtistsStream[dateAsString] ?? [];
 
         double value = 0;
         for (int i = 0; i <= index; i++) {
@@ -110,7 +112,7 @@ class ChartTopArtistsStream extends CustomLineChart {
         }
 
         spots.add(FlSpot(date, value));
-      });
+      }
 
       return LineChartBarData(
         isCurved: true,
@@ -131,7 +133,7 @@ class ChartTopArtistsStream extends CustomLineChart {
 
   List<BetweenBarsData> getBetweenBarsData() {
     final int artistsCount =
-        this.chartData.topArtistsStream[this.chartData.topArtistsStream.keys.first]?.length ??
+        chartData.topArtistsStream[chartData.topArtistsStream.keys.first]?.length ??
             0;
 
     return Iterable<int>.generate(artistsCount)
@@ -144,6 +146,7 @@ class ChartTopArtistsStream extends CustomLineChart {
         .toList();
   }
 
+  @override
   Widget getHorizontalTitlesWidget(double value, TitleMeta meta) {
     return getHorizontalTitlesWidgetWithDate(value, meta);
   }
diff --git a/lib/ui/widgets/content/statistics_global.dart b/lib/ui/widgets/content/statistics_global.dart
index 49c0203d3d93c8d77c1bb1b6d20dd9378b29aa6b..838e3b24b77473c48de2e74adfe9506709bb82b0 100644
--- a/lib/ui/widgets/content/statistics_global.dart
+++ b/lib/ui/widgets/content/statistics_global.dart
@@ -22,8 +22,8 @@ class ContentStatisticsGlobal extends StatelessWidget {
           style: textTheme.bodyMedium,
         ).tr(
           namedArgs: {
-            'count': this.statistics.totalCount != null
-                ? this.statistics.totalCount.toString()
+            'count': statistics.totalCount != null
+                ? statistics.totalCount.toString()
                 : placeholder,
           },
         ),
@@ -32,8 +32,8 @@ class ContentStatisticsGlobal extends StatelessWidget {
           style: textTheme.bodyMedium,
         ).tr(
           namedArgs: {
-            'datetime': this.statistics.lastScrobble != null
-                ? DateFormat().format(this.statistics.lastScrobble ?? DateTime.now())
+            'datetime': statistics.lastScrobble != null
+                ? DateFormat().format(statistics.lastScrobble ?? DateTime.now())
                 : placeholder,
           },
         ),
diff --git a/lib/ui/widgets/content/statistics_recent.dart b/lib/ui/widgets/content/statistics_recent.dart
index f79aef9a9ed16c8c718c156ca73aab4eb695b3ac..e5a748fe8c2597acea395a3f0e7a2fe833f984d9 100644
--- a/lib/ui/widgets/content/statistics_recent.dart
+++ b/lib/ui/widgets/content/statistics_recent.dart
@@ -17,17 +17,17 @@ class ContentStatisticsRecent extends StatelessWidget {
       crossAxisAlignment: CrossAxisAlignment.start,
       children: <Widget>[
         Text(
-          (this.statistics.recentCount != null &&
-                  this.statistics.firstPlayedArtistsCount != null &&
-                  this.statistics.firstPlayedTracksCount != null)
+          (statistics.recentCount != null &&
+                  statistics.firstPlayedArtistsCount != null &&
+                  statistics.firstPlayedTracksCount != null)
               ? 'statistics_recent_scrobbles_count_and_discoveries'
               : '',
           style: textTheme.bodyMedium,
         ).tr(
           namedArgs: {
-            'count': this.statistics.recentCount.toString(),
-            'artistsCount': this.statistics.firstPlayedArtistsCount.toString(),
-            'tracksCount': this.statistics.firstPlayedTracksCount.toString(),
+            'count': statistics.recentCount.toString(),
+            'artistsCount': statistics.firstPlayedArtistsCount.toString(),
+            'tracksCount': statistics.firstPlayedTracksCount.toString(),
           },
         ),
       ],
diff --git a/lib/ui/widgets/error.dart b/lib/ui/widgets/error.dart
index d09c290104cba7331606c555d8206b999d778d19..2a68880c0c45daf6272e4bb179a4743d586888a4 100644
--- a/lib/ui/widgets/error.dart
+++ b/lib/ui/widgets/error.dart
@@ -11,9 +11,9 @@ class ShowErrorWidget extends StatelessWidget {
     print(message);
 
     return Text(
-      '⚠️ ' + tr(message),
+      '⚠️ ${tr(message)}',
       textAlign: TextAlign.start,
-      style: TextStyle(color: Colors.red),
+      style: const TextStyle(color: Colors.red),
     );
   }
 }
diff --git a/lib/ui/widgets/settings_form.dart b/lib/ui/widgets/settings_form.dart
index de09c91d03229cc7082e0bc8a7d7709419d4f915..0afaabee22c35d3a29eb7b18cab300d1889a0017 100644
--- a/lib/ui/widgets/settings_form.dart
+++ b/lib/ui/widgets/settings_form.dart
@@ -98,22 +98,22 @@ class _SettingsFormState extends State<SettingsForm> {
       crossAxisAlignment: CrossAxisAlignment.start,
       mainAxisSize: MainAxisSize.max,
       children: <Widget>[
-        SizedBox(height: 8),
+        const SizedBox(height: 8),
         AppTitle2(text: tr('settings_title_global')),
 
         // Username
-        Text('settings_label_username').tr(),
+        const Text('settings_label_username').tr(),
         TextFormField(
           controller: usernameController,
           decoration: InputDecoration(
-            border: UnderlineInputBorder(),
+            border: const UnderlineInputBorder(),
             suffixIcon: ElevatedButton(
               style: ElevatedButton.styleFrom(
-                shape: new RoundedRectangleBorder(
-                  borderRadius: new BorderRadius.circular(6.0),
+                shape: RoundedRectangleBorder(
+                  borderRadius: BorderRadius.circular(6.0),
                 ),
               ),
-              child: Icon(UniconsLine.save),
+              child: const Icon(UniconsLine.save),
               onPressed: () {
                 saveSettings();
               },
@@ -121,7 +121,7 @@ class _SettingsFormState extends State<SettingsForm> {
           ),
         ),
 
-        SizedBox(height: 8),
+        const SizedBox(height: 8),
         AppTitle2(text: tr('settings_title_days_count')),
 
         // Statistics (recent)
@@ -129,7 +129,7 @@ class _SettingsFormState extends State<SettingsForm> {
           mainAxisAlignment: MainAxisAlignment.end,
           crossAxisAlignment: CrossAxisAlignment.center,
           children: [
-            Text('settings_label_statistics_recent_days_count').tr(),
+            const Text('settings_label_statistics_recent_days_count').tr(),
             ToggleButtons(
               onPressed: (int index) {
                 setState(() {
@@ -155,7 +155,7 @@ class _SettingsFormState extends State<SettingsForm> {
           mainAxisAlignment: MainAxisAlignment.end,
           crossAxisAlignment: CrossAxisAlignment.center,
           children: [
-            Text('settings_label_timeline_days_count').tr(),
+            const Text('settings_label_timeline_days_count').tr(),
             ToggleButtons(
               onPressed: (int index) {
                 setState(() {
@@ -181,7 +181,7 @@ class _SettingsFormState extends State<SettingsForm> {
           mainAxisAlignment: MainAxisAlignment.end,
           crossAxisAlignment: CrossAxisAlignment.center,
           children: [
-            Text('settings_label_top_artists_days_count').tr(),
+            const Text('settings_label_top_artists_days_count').tr(),
             ToggleButtons(
               onPressed: (int index) {
                 setState(() {
@@ -207,7 +207,7 @@ class _SettingsFormState extends State<SettingsForm> {
           mainAxisAlignment: MainAxisAlignment.end,
           crossAxisAlignment: CrossAxisAlignment.center,
           children: [
-            Text('settings_label_discoveries_days_count').tr(),
+            const Text('settings_label_discoveries_days_count').tr(),
             ToggleButtons(
               onPressed: (int index) {
                 setState(() {
@@ -233,7 +233,7 @@ class _SettingsFormState extends State<SettingsForm> {
           mainAxisAlignment: MainAxisAlignment.end,
           crossAxisAlignment: CrossAxisAlignment.center,
           children: [
-            Text('settings_label_distribution_days_count').tr(),
+            const Text('settings_label_distribution_days_count').tr(),
             ToggleButtons(
               onPressed: (int index) {
                 setState(() {
@@ -254,7 +254,7 @@ class _SettingsFormState extends State<SettingsForm> {
           ],
         ),
 
-        SizedBox(height: 8),
+        const SizedBox(height: 8),
         AppTitle2(text: tr('settings_title_counts')),
 
         // New artists count
@@ -262,7 +262,7 @@ class _SettingsFormState extends State<SettingsForm> {
           mainAxisAlignment: MainAxisAlignment.end,
           crossAxisAlignment: CrossAxisAlignment.center,
           children: [
-            Text('settings_label_new_artists_count').tr(),
+            const Text('settings_label_new_artists_count').tr(),
             ToggleButtons(
               onPressed: (int index) {
                 setState(() {
@@ -287,7 +287,7 @@ class _SettingsFormState extends State<SettingsForm> {
           mainAxisAlignment: MainAxisAlignment.end,
           crossAxisAlignment: CrossAxisAlignment.center,
           children: [
-            Text('settings_label_new_tracks_count').tr(),
+            const Text('settings_label_new_tracks_count').tr(),
             ToggleButtons(
               onPressed: (int index) {
                 setState(() {
diff --git a/pubspec.lock b/pubspec.lock
index afdb62534217d42cfb47e64e6e38018bade04df7..d63bff2106858c1dc36319a2f47808d049b704ff 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -21,10 +21,10 @@ packages:
     dependency: transitive
     description:
       name: bloc
-      sha256: "3820f15f502372d979121de1f6b97bfcf1630ebff8fe1d52fb2b0bfa49be5b49"
+      sha256: f53a110e3b48dcd78136c10daa5d51512443cea5e1348c9d80a320095fa2db9e
       url: "https://pub.dev"
     source: hosted
-    version: "8.1.2"
+    version: "8.1.3"
   characters:
     dependency: transitive
     description:
@@ -61,10 +61,10 @@ packages:
     dependency: "direct main"
     description:
       name: easy_localization
-      sha256: de63e3b422adfc97f256cbb3f8cf12739b6a4993d390f3cadb3f51837afaefe5
+      sha256: "9c86754b22aaa3e74e471635b25b33729f958dd6fb83df0ad6612948a7b231af"
       url: "https://pub.dev"
     source: hosted
-    version: "3.0.3"
+    version: "3.0.4"
   easy_logger:
     dependency: transitive
     description:
@@ -85,10 +85,10 @@ packages:
     dependency: transitive
     description:
       name: ffi
-      sha256: "7bf0adc28a23d395f19f3f1eb21dd7cfd1dd9f8e1c50051c069122e6853bc878"
+      sha256: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21"
       url: "https://pub.dev"
     source: hosted
-    version: "2.1.0"
+    version: "2.1.2"
   file:
     dependency: transitive
     description:
@@ -101,10 +101,10 @@ packages:
     dependency: "direct main"
     description:
       name: fl_chart
-      sha256: fe6fec7d85975a99c73b9515a69a6e291364accfa0e4a5b3ce6de814d74b9a1c
+      sha256: "00b74ae680df6b1135bdbea00a7d1fc072a9180b7c3f3702e4b19a9943f5ed7d"
       url: "https://pub.dev"
     source: hosted
-    version: "0.66.0"
+    version: "0.66.2"
   flutter:
     dependency: "direct main"
     description: flutter
@@ -114,10 +114,18 @@ packages:
     dependency: "direct main"
     description:
       name: flutter_bloc
-      sha256: e74efb89ee6945bcbce74a5b3a5a3376b088e5f21f55c263fc38cbdc6237faae
+      sha256: "87325da1ac757fcc4813e6b34ed5dd61169973871fdf181d6c2109dd6935ece1"
       url: "https://pub.dev"
     source: hosted
-    version: "8.1.3"
+    version: "8.1.4"
+  flutter_lints:
+    dependency: "direct dev"
+    description:
+      name: flutter_lints
+      sha256: e2a421b7e59244faef694ba7b30562e489c2b489866e505074eb005cd7060db7
+      url: "https://pub.dev"
+    source: hosted
+    version: "3.0.1"
   flutter_localizations:
     dependency: transitive
     description: flutter
@@ -137,7 +145,7 @@ packages:
     source: sdk
     version: "0.0.0"
   hive:
-    dependency: transitive
+    dependency: "direct main"
     description:
       name: hive
       sha256: "8dcf6db979d7933da8217edcec84e9df1bdb4e4edc7fc77dbd5aa74356d6d941"
@@ -148,10 +156,10 @@ packages:
     dependency: "direct main"
     description:
       name: http
-      sha256: d4872660c46d929f6b8a9ef4e7a7eff7e49bbf0c4ec3f385ee32df5119175139
+      sha256: "761a297c042deedc1ffbb156d6e2af13886bb305c2a343a4d972504cd67dd938"
       url: "https://pub.dev"
     source: hosted
-    version: "1.1.2"
+    version: "1.2.1"
   http_parser:
     dependency: transitive
     description:
@@ -164,10 +172,10 @@ packages:
     dependency: "direct main"
     description:
       name: hydrated_bloc
-      sha256: c925e49704c052a8f249226ae7603f86bfa776b910816390763b956c71d2cbaf
+      sha256: "00a2099680162e74b5a836b8a7f446e478520a9cae9f6032e028ad8129f4432d"
       url: "https://pub.dev"
     source: hosted
-    version: "9.1.3"
+    version: "9.1.4"
   intl:
     dependency: transitive
     description:
@@ -184,22 +192,30 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "0.2.2"
+  lints:
+    dependency: transitive
+    description:
+      name: lints
+      sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290
+      url: "https://pub.dev"
+    source: hosted
+    version: "3.0.0"
   material_color_utilities:
     dependency: transitive
     description:
       name: material_color_utilities
-      sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41"
+      sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a"
       url: "https://pub.dev"
     source: hosted
-    version: "0.5.0"
+    version: "0.8.0"
   meta:
     dependency: transitive
     description:
       name: meta
-      sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e
+      sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04
       url: "https://pub.dev"
     source: hosted
-    version: "1.10.0"
+    version: "1.11.0"
   nested:
     dependency: transitive
     description:
@@ -212,18 +228,18 @@ packages:
     dependency: transitive
     description:
       name: path
-      sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917"
+      sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af"
       url: "https://pub.dev"
     source: hosted
-    version: "1.8.3"
+    version: "1.9.0"
   path_provider:
     dependency: "direct main"
     description:
       name: path_provider
-      sha256: a1aa8aaa2542a6bc57e381f132af822420216c80d4781f7aa085ca3229208aaa
+      sha256: b27217933eeeba8ff24845c34003b003b2b22151de3c908d0e679e8fe1aa078b
       url: "https://pub.dev"
     source: hosted
-    version: "2.1.1"
+    version: "2.1.2"
   path_provider_android:
     dependency: transitive
     description:
@@ -236,10 +252,10 @@ packages:
     dependency: transitive
     description:
       name: path_provider_foundation
-      sha256: "19314d595120f82aca0ba62787d58dde2cc6b5df7d2f0daf72489e38d1b57f2d"
+      sha256: "5a7999be66e000916500be4f15a3633ebceb8302719b47b9cc49ce924125350f"
       url: "https://pub.dev"
     source: hosted
-    version: "2.3.1"
+    version: "2.3.2"
   path_provider_linux:
     dependency: transitive
     description:
@@ -252,10 +268,10 @@ packages:
     dependency: transitive
     description:
       name: path_provider_platform_interface
-      sha256: "94b1e0dd80970c1ce43d5d4e050a9918fce4f4a775e6142424c30a29a363265c"
+      sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334"
       url: "https://pub.dev"
     source: hosted
-    version: "2.1.1"
+    version: "2.1.2"
   path_provider_windows:
     dependency: transitive
     description:
@@ -268,18 +284,18 @@ packages:
     dependency: transitive
     description:
       name: platform
-      sha256: "0a279f0707af40c890e80b1e9df8bb761694c074ba7e1d4ab1bc4b728e200b59"
+      sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec"
       url: "https://pub.dev"
     source: hosted
-    version: "3.1.3"
+    version: "3.1.4"
   plugin_platform_interface:
     dependency: transitive
     description:
       name: plugin_platform_interface
-      sha256: f4f88d4a900933e7267e2b353594774fc0d07fb072b47eedcd5b54e1ea3269f8
+      sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02"
       url: "https://pub.dev"
     source: hosted
-    version: "2.1.7"
+    version: "2.1.8"
   provider:
     dependency: transitive
     description:
@@ -308,10 +324,10 @@ packages:
     dependency: transitive
     description:
       name: shared_preferences_foundation
-      sha256: "7bf53a9f2d007329ee6f3df7268fd498f8373602f943c975598bbb34649b62a7"
+      sha256: "7708d83064f38060c7b39db12aefe449cb8cdc031d6062280087bc4cdb988f5c"
       url: "https://pub.dev"
     source: hosted
-    version: "2.3.4"
+    version: "2.3.5"
   shared_preferences_linux:
     dependency: transitive
     description:
@@ -324,18 +340,18 @@ packages:
     dependency: transitive
     description:
       name: shared_preferences_platform_interface
-      sha256: d4ec5fc9ebb2f2e056c617112aa75dcf92fc2e4faaf2ae999caa297473f75d8a
+      sha256: "22e2ecac9419b4246d7c22bfbbda589e3acf5c0351137d87dd2939d984d37c3b"
       url: "https://pub.dev"
     source: hosted
-    version: "2.3.1"
+    version: "2.3.2"
   shared_preferences_web:
     dependency: transitive
     description:
       name: shared_preferences_web
-      sha256: "7b15ffb9387ea3e237bb7a66b8a23d2147663d391cafc5c8f37b2e7b4bde5d21"
+      sha256: d762709c2bbe80626ecc819143013cc820fa49ca5e363620ee20a8b15a3e3daf
       url: "https://pub.dev"
     source: hosted
-    version: "2.2.2"
+    version: "2.2.1"
   shared_preferences_windows:
     dependency: transitive
     description:
@@ -409,26 +425,26 @@ packages:
     dependency: transitive
     description:
       name: web
-      sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152
+      sha256: "1d9158c616048c38f712a6646e317a3426da10e884447626167240d45209cbad"
       url: "https://pub.dev"
     source: hosted
-    version: "0.3.0"
+    version: "0.5.0"
   win32:
     dependency: transitive
     description:
       name: win32
-      sha256: b0f37db61ba2f2e9b7a78a1caece0052564d1bc70668156cf3a29d676fe4e574
+      sha256: "464f5674532865248444b4c3daca12bd9bf2d7c47f759ce2617986e7229494a8"
       url: "https://pub.dev"
     source: hosted
-    version: "5.1.1"
+    version: "5.2.0"
   xdg_directories:
     dependency: transitive
     description:
       name: xdg_directories
-      sha256: "589ada45ba9e39405c198fe34eb0f607cddb2108527e658136120892beac46d2"
+      sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d
       url: "https://pub.dev"
     source: hosted
-    version: "1.0.3"
+    version: "1.0.4"
 sdks:
-  dart: ">=3.2.0 <4.0.0"
+  dart: ">=3.3.0 <4.0.0"
   flutter: ">=3.16.0"
diff --git a/pubspec.yaml b/pubspec.yaml
index 76d2f8c12006e6f2fd439cae404a1b752c4a0e21..fcf34647c6292f58a2c907d45963df7c3c7e02ff 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -3,7 +3,7 @@ description: Display scrobbles data and charts
 
 publish_to: 'none'
 
-version: 0.0.52+52
+version: 0.0.53+53
 
 environment:
   sdk: '^3.0.0'
@@ -16,6 +16,7 @@ dependencies:
   equatable: ^2.0.5
   fl_chart: ^0.66.0
   flutter_bloc: ^8.1.1
+  hive: ^2.2.3
   http: ^1.1.0
   path_provider: ^2.0.11
   hydrated_bloc: ^9.0.0
@@ -23,6 +24,9 @@ dependencies:
   unicons: ^2.1.1
   flutter_swipe: ^1.0.1
 
+dev_dependencies:
+  flutter_lints: ^3.0.1
+
 flutter:
   uses-material-design: false
   assets: