From 760b2b8e32661af5b45bda58faf8626596f33952 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Harrault?= <benoit@harrault.fr> Date: Tue, 31 Oct 2023 01:07:33 +0100 Subject: [PATCH] Add persistence --- android/gradle.properties | 4 +-- lib/activities/ActivityDemoPage.dart | 44 +++++++++++++++++++++++++++- lib/cubit/data_cubit.dart | 29 ++++++++++++++++++ lib/cubit/data_state.dart | 15 ++++++++++ lib/ui/screens/about_page.dart | 1 + pubspec.lock | 8 +++++ pubspec.yaml | 3 +- 7 files changed, 100 insertions(+), 4 deletions(-) create mode 100644 lib/cubit/data_cubit.dart create mode 100644 lib/cubit/data_state.dart diff --git a/android/gradle.properties b/android/gradle.properties index 5a36ab8..2aa2a7b 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=1.0.24 -app.versionCode=25 +app.versionName=1.0.25 +app.versionCode=26 diff --git a/lib/activities/ActivityDemoPage.dart b/lib/activities/ActivityDemoPage.dart index d6c1dba..24cf707 100644 --- a/lib/activities/ActivityDemoPage.dart +++ b/lib/activities/ActivityDemoPage.dart @@ -1,5 +1,9 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:ionicons/ionicons.dart'; +import 'package:random/config/theme.dart'; +import 'package:random/cubit/data_cubit.dart'; class ActivityDemoPage extends StatelessWidget { const ActivityDemoPage({super.key}); @@ -21,7 +25,9 @@ class ActivityDemoPage extends StatelessWidget { mainAxisSize: MainAxisSize.max, children: <Widget>[ Text('TOP').tr(), - SizedBox(height: 2), + SizedBox(height: 20), + persistedCounterBlock(), + SizedBox(height: 20), Text('BOTTOM').tr(), ], ), @@ -31,4 +37,40 @@ class ActivityDemoPage extends StatelessWidget { ), ); } + + Widget persistedCounterBlock() { + return BlocProvider<DataCubit>( + create: (BuildContext context) => DataCubit(), + child: BlocBuilder<DataCubit, DataState>( + builder: (BuildContext context, DataState state) { + void updateCounter(int delta) { + BlocProvider.of<DataCubit>(context).getData( + DataState(counter: (state.counter ?? 0) + delta), + ); + } + + return Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + IconButton( + icon: Icon(Ionicons.arrow_down), + color: appTheme.primaryColor, + onPressed: () => updateCounter(-1), + ), + Padding( + padding: EdgeInsets.all(10), + child: Text(state.counter.toString()), + ), + IconButton( + icon: Icon(Ionicons.arrow_up), + color: appTheme.primaryColor, + onPressed: () => updateCounter(1), + ), + ], + ); + }, + ), + ); + } } diff --git a/lib/cubit/data_cubit.dart b/lib/cubit/data_cubit.dart new file mode 100644 index 0000000..05335fb --- /dev/null +++ b/lib/cubit/data_cubit.dart @@ -0,0 +1,29 @@ +import 'package:equatable/equatable.dart'; +import 'package:flutter/material.dart'; +import 'package:hydrated_bloc/hydrated_bloc.dart'; + +part 'data_state.dart'; + +class DataCubit extends HydratedCubit<DataState> { + DataCubit() : super(const DataState()); + + void getData(DataState state) { + emit(state); + } + + @override + DataState? fromJson(Map<String, dynamic> json) { + int counter = json['counter'] as int; + + return DataState( + counter: counter, + ); + } + + @override + Map<String, int>? toJson(DataState state) { + return <String, int>{ + 'counter': state.counter ?? 0, + }; + } +} diff --git a/lib/cubit/data_state.dart b/lib/cubit/data_state.dart new file mode 100644 index 0000000..c1ad76e --- /dev/null +++ b/lib/cubit/data_state.dart @@ -0,0 +1,15 @@ +part of 'data_cubit.dart'; + +@immutable +class DataState extends Equatable { + const DataState({ + this.counter, + }); + + final int? counter; + + @override + List<Object?> get props => <Object?>[ + counter, + ]; +} diff --git a/lib/ui/screens/about_page.dart b/lib/ui/screens/about_page.dart index 5c6a647..9ad2fcf 100644 --- a/lib/ui/screens/about_page.dart +++ b/lib/ui/screens/about_page.dart @@ -11,6 +11,7 @@ class AboutPage extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.max, children: <Widget>[ + SizedBox(height: 50), Text( 'about_title', textAlign: TextAlign.start, diff --git a/pubspec.lock b/pubspec.lock index f0fbed2..814ae8d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -65,6 +65,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.0.2" + equatable: + dependency: "direct main" + description: + name: equatable + sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2 + url: "https://pub.dev" + source: hosted + version: "2.0.5" ffi: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index f779334..8afde1c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -3,7 +3,7 @@ description: A random application, for testing purpose only. publish_to: 'none' -version: 1.0.24+25 +version: 1.0.25+26 environment: sdk: '^3.0.0' @@ -13,6 +13,7 @@ dependencies: sdk: flutter easy_localization: ^3.0.1 + equatable: ^2.0.5 flutter_bloc: ^8.1.1 path_provider: ^2.0.11 hydrated_bloc: ^9.0.0 -- GitLab