From 3e546de751af350b2e81e36f76bf54f1395d41a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20K=C4=85dzio=C5=82ka?= Date: Mon, 17 Feb 2025 11:24:55 +0100 Subject: [PATCH 1/2] Updated to flutter 3.27.0 --- README.md | 3 ++- flutter_module/.fvm/flutter_sdk | 1 - flutter_module/.fvm/fvm_config.json | 4 --- flutter_module/.fvmrc | 4 +++ flutter_module/.gitignore | 3 +++ flutter_module/pubspec.lock | 38 ++++++++++++++--------------- flutter_module/pubspec.yaml | 2 +- 7 files changed, 29 insertions(+), 26 deletions(-) delete mode 100644 flutter_module/.fvm/flutter_sdk delete mode 100644 flutter_module/.fvm/fvm_config.json create mode 100644 flutter_module/.fvmrc diff --git a/README.md b/README.md index 7774aa5..83956dc 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ # SnipMeApp -Simple application that allows to save and share code snippets in different languages. +Simple application that allows to save and share code snippets in different languages. + diff --git a/flutter_module/.fvm/flutter_sdk b/flutter_module/.fvm/flutter_sdk deleted file mode 100644 index b478f77..0000000 --- a/flutter_module/.fvm/flutter_sdk +++ /dev/null @@ -1 +0,0 @@ -/Users/tkadziolka/fvm/versions/3.24.0 \ No newline at end of file diff --git a/flutter_module/.fvm/fvm_config.json b/flutter_module/.fvm/fvm_config.json deleted file mode 100644 index 8142fd7..0000000 --- a/flutter_module/.fvm/fvm_config.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "flutterSdkVersion": "3.24.0", - "flavors": {} -} \ No newline at end of file diff --git a/flutter_module/.fvmrc b/flutter_module/.fvmrc new file mode 100644 index 0000000..34136bb --- /dev/null +++ b/flutter_module/.fvmrc @@ -0,0 +1,4 @@ +{ + "flutter": "3.27.0", + "flavors": {} +} \ No newline at end of file diff --git a/flutter_module/.gitignore b/flutter_module/.gitignore index 23dcdd3..f09264d 100644 --- a/flutter_module/.gitignore +++ b/flutter_module/.gitignore @@ -44,3 +44,6 @@ app.*.symbols # Obfuscation related app.*.map.json + +# FVM Version Cache +.fvm/ \ No newline at end of file diff --git a/flutter_module/pubspec.lock b/flutter_module/pubspec.lock index 4e8fcf8..b75a528 100644 --- a/flutter_module/pubspec.lock +++ b/flutter_module/pubspec.lock @@ -141,10 +141,10 @@ packages: dependency: "direct main" description: name: collection - sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf url: "https://pub.dev" source: hosted - version: "1.18.0" + version: "1.19.0" convert: dependency: transitive description: @@ -324,18 +324,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" + sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06" url: "https://pub.dev" source: hosted - version: "10.0.5" + version: "10.0.7" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" + sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379" url: "https://pub.dev" source: hosted - version: "3.0.5" + version: "3.0.8" leak_tracker_testing: dependency: transitive description: @@ -492,7 +492,7 @@ packages: dependency: transitive description: flutter source: sdk - version: "0.0.99" + version: "0.0.0" source_map_stack_trace: dependency: transitive description: @@ -521,10 +521,10 @@ packages: dependency: transitive description: name: stack_trace - sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" url: "https://pub.dev" source: hosted - version: "1.11.1" + version: "1.12.0" stream_channel: dependency: transitive description: @@ -545,10 +545,10 @@ packages: dependency: transitive description: name: string_scanner - sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.3.0" term_glyph: dependency: transitive description: @@ -561,26 +561,26 @@ packages: dependency: "direct main" description: name: test - sha256: "7ee44229615f8f642b68120165ae4c2a75fe77ae2065b1e55ae4711f6cf0899e" + sha256: "713a8789d62f3233c46b4a90b174737b2c04cb6ae4500f2aa8b1be8f03f5e67f" url: "https://pub.dev" source: hosted - version: "1.25.7" + version: "1.25.8" test_api: dependency: transitive description: name: test_api - sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" + sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" url: "https://pub.dev" source: hosted - version: "0.7.2" + version: "0.7.3" test_core: dependency: transitive description: name: test_core - sha256: "55ea5a652e38a1dfb32943a7973f3681a60f872f8c3a05a14664ad54ef9c6696" + sha256: "12391302411737c176b0b5d6491f466b0dd56d4763e347b6714efbaa74d7953d" url: "https://pub.dev" source: hosted - version: "0.6.4" + version: "0.6.5" timing: dependency: transitive description: @@ -617,10 +617,10 @@ packages: dependency: transitive description: name: vm_service - sha256: f652077d0bdf60abe4c1f6377448e8655008eef28f128bc023f7b5e8dfeb48fc + sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b url: "https://pub.dev" source: hosted - version: "14.2.4" + version: "14.3.0" watcher: dependency: transitive description: diff --git a/flutter_module/pubspec.yaml b/flutter_module/pubspec.yaml index 629edd0..231e2b9 100644 --- a/flutter_module/pubspec.yaml +++ b/flutter_module/pubspec.yaml @@ -18,7 +18,7 @@ description: A new flutter module project. version: 1.0.0+1 environment: - sdk: ">=2.18.2 <3.0.0" + sdk: ">=3.0.0 <4.0.0" dependencies: flutter: From b4e442c6ee5d52439bf61f1a57c1aca278d195d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20K=C4=85dzio=C5=82ka?= Date: Wed, 26 Feb 2025 10:58:26 +0100 Subject: [PATCH 2/2] Introduce Riverpod (#28) * Migrated login to provider * Added other providers * Handled providers in pages --- flutter_module/lib/main.dart | 3 +- .../details_page_state_provider.dart | 40 +++++++++++++++++++ .../providers/login_page_state_provider.dart | 40 +++++++++++++++++++ .../providers/main_page_state_provider.dart | 40 +++++++++++++++++++ .../providers/model_bridge_provider.dart | 6 +++ .../presentation/screens/details_screen.dart | 39 ++++++++---------- .../presentation/screens/login_screen.dart | 28 +++++-------- .../lib/presentation/screens/main_screen.dart | 35 +++++++--------- flutter_module/pubspec.lock | 40 +++++++++++++++++++ flutter_module/pubspec.yaml | 9 +++++ 10 files changed, 218 insertions(+), 62 deletions(-) create mode 100644 flutter_module/lib/presentation/providers/details_page_state_provider.dart create mode 100644 flutter_module/lib/presentation/providers/login_page_state_provider.dart create mode 100644 flutter_module/lib/presentation/providers/main_page_state_provider.dart create mode 100644 flutter_module/lib/presentation/providers/model_bridge_provider.dart diff --git a/flutter_module/lib/main.dart b/flutter_module/lib/main.dart index 0a72b44..17e9fc7 100644 --- a/flutter_module/lib/main.dart +++ b/flutter_module/lib/main.dart @@ -6,9 +6,10 @@ import 'package:flutter_module/presentation/screens//main_screen.dart'; import 'package:flutter_module/presentation/screens/details_screen.dart'; import 'package:flutter_module/presentation/screens/login_screen.dart'; import 'package:flutter_module/utils/extensions/text_extensions.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router_plus/go_router_plus.dart'; -void main() => runApp(MyApp()); +void main() => runApp(ProviderScope(child: MyApp())); class MyApp extends StatelessWidget { MyApp({super.key}); diff --git a/flutter_module/lib/presentation/providers/details_page_state_provider.dart b/flutter_module/lib/presentation/providers/details_page_state_provider.dart new file mode 100644 index 0000000..4c46edf --- /dev/null +++ b/flutter_module/lib/presentation/providers/details_page_state_provider.dart @@ -0,0 +1,40 @@ +import 'package:flutter_module/model/main_model.dart'; +import 'package:flutter_module/presentation/providers/model_bridge_provider.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; + +final detailsPageStateProvider = + StateNotifierProvider<_DetailPageStateNotifier, DetailModelStateData>( + (ref) => _DetailPageStateNotifier(detailsBridge: ref.read(detailsBridge)), +); + +final detailsPageEventProvider = StateNotifierProvider<_DetailPageEventNotifier, DetailModelEventData>( + (ref) => _DetailPageEventNotifier(detailsBridge: ref.read(detailsBridge)), +); + +class _DetailPageStateNotifier extends StateNotifier { + _DetailPageStateNotifier({ + required this.detailsBridge, + }) : super(DetailModelStateData()) { + // Simulate hook's state & event refreshing + Stream.periodic( + const Duration(milliseconds: 500), + (_) => detailsBridge.getState(), + ).listen((newState) async => state = await newState); + } + + final DetailModelBridge detailsBridge; +} + +class _DetailPageEventNotifier extends StateNotifier { + _DetailPageEventNotifier({ + required this.detailsBridge, + }) : super(DetailModelEventData()) { + // Simulate hook's state & event refreshing + Stream.periodic( + const Duration(milliseconds: 500), + (_) => detailsBridge.getEvent(), + ).listen((newEvent) async => state = await newEvent); + } + + final DetailModelBridge detailsBridge; +} diff --git a/flutter_module/lib/presentation/providers/login_page_state_provider.dart b/flutter_module/lib/presentation/providers/login_page_state_provider.dart new file mode 100644 index 0000000..35aa7b2 --- /dev/null +++ b/flutter_module/lib/presentation/providers/login_page_state_provider.dart @@ -0,0 +1,40 @@ +import 'package:flutter_module/model/main_model.dart'; +import 'package:flutter_module/presentation/providers/model_bridge_provider.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; + +final loginPageStateProvider = + StateNotifierProvider<_LoginPageStateNotifier, LoginModelStateData>( + (ref) => _LoginPageStateNotifier(loginBridge: ref.read(loginBridge)), +); + +final loginPageEventProvider = StateNotifierProvider<_LoginPageEventNotifier, LoginModelEventData>( + (ref) => _LoginPageEventNotifier(loginBridge: ref.read(loginBridge)), +); + +class _LoginPageStateNotifier extends StateNotifier { + _LoginPageStateNotifier({ + required this.loginBridge, + }) : super(LoginModelStateData()) { + // Simulate hook's state & event refreshing + Stream.periodic( + const Duration(milliseconds: 500), + (_) => loginBridge.getState(), + ).listen((newState) async => state = await newState); + } + + final LoginModelBridge loginBridge; +} + +class _LoginPageEventNotifier extends StateNotifier { + _LoginPageEventNotifier({ + required this.loginBridge, + }) : super(LoginModelEventData()) { + // Simulate hook's state & event refreshing + Stream.periodic( + const Duration(milliseconds: 500), + (_) => loginBridge.getEvent(), + ).listen((newEvent) async => state = await newEvent); + } + + final LoginModelBridge loginBridge; +} diff --git a/flutter_module/lib/presentation/providers/main_page_state_provider.dart b/flutter_module/lib/presentation/providers/main_page_state_provider.dart new file mode 100644 index 0000000..a7c5dcc --- /dev/null +++ b/flutter_module/lib/presentation/providers/main_page_state_provider.dart @@ -0,0 +1,40 @@ +import 'package:flutter_module/model/main_model.dart'; +import 'package:flutter_module/presentation/providers/model_bridge_provider.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; + +final mainPageStateProvider = + StateNotifierProvider<_MainPageStateNotifier, MainModelStateData>( + (ref) => _MainPageStateNotifier(mainBridge: ref.read(mainBridge)), +); + +final mainPageEventProvider = StateNotifierProvider<_MainPageEventNotifier, MainModelEventData>( + (ref) => _MainPageEventNotifier(mainBridge: ref.read(mainBridge)), +); + +class _MainPageStateNotifier extends StateNotifier { + _MainPageStateNotifier({ + required this.mainBridge, + }) : super(MainModelStateData()) { + // Simulate hook's state & event refreshing + Stream.periodic( + const Duration(milliseconds: 500), + (_) => mainBridge.getState(), + ).listen((newState) async => state = await newState); + } + + final MainModelBridge mainBridge; +} + +class _MainPageEventNotifier extends StateNotifier { + _MainPageEventNotifier({ + required this.mainBridge, + }) : super(MainModelEventData()) { + // Simulate hook's state & event refreshing + Stream.periodic( + const Duration(milliseconds: 500), + (_) => mainBridge.getEvent(), + ).listen((newEvent) async => state = await newEvent); + } + + final MainModelBridge mainBridge; +} diff --git a/flutter_module/lib/presentation/providers/model_bridge_provider.dart b/flutter_module/lib/presentation/providers/model_bridge_provider.dart new file mode 100644 index 0000000..19a4fa0 --- /dev/null +++ b/flutter_module/lib/presentation/providers/model_bridge_provider.dart @@ -0,0 +1,6 @@ +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:flutter_module/model/main_model.dart'; + +final loginBridge = Provider((ref) => LoginModelBridge()); +final mainBridge = Provider((ref) => MainModelBridge()); +final detailsBridge = Provider((ref) => DetailModelBridge()); \ No newline at end of file diff --git a/flutter_module/lib/presentation/screens/details_screen.dart b/flutter_module/lib/presentation/screens/details_screen.dart index 50962c7..9ef6271 100644 --- a/flutter_module/lib/presentation/screens/details_screen.dart +++ b/flutter_module/lib/presentation/screens/details_screen.dart @@ -2,6 +2,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_module/model/main_model.dart'; import 'package:flutter_module/presentation/navigation/details/details_navigator.dart'; +import 'package:flutter_module/presentation/providers/details_page_state_provider.dart'; +import 'package:flutter_module/presentation/providers/model_bridge_provider.dart'; import 'package:flutter_module/presentation/screens/named_screen.dart'; import 'package:flutter_module/presentation/styles/color_styles.dart'; import 'package:flutter_module/presentation/styles/dimens.dart'; @@ -15,6 +17,7 @@ import 'package:flutter_module/utils/extensions/state_extensions.dart'; import 'package:flutter_module/utils/hooks/use_navigator.dart'; import 'package:flutter_module/utils/hooks/use_observable_state_hook.dart'; import 'package:go_router/go_router.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; class DetailsScreen extends NamedScreen { DetailsScreen({ @@ -34,10 +37,9 @@ class DetailsScreen extends NamedScreen { model: model, ); } - } -class _DetailsPage extends HookWidget { +class _DetailsPage extends HookConsumerWidget { const _DetailsPage({ required this.navigator, required this.model, @@ -47,24 +49,17 @@ class _DetailsPage extends HookWidget { final DetailModelBridge model; @override - Widget build(BuildContext context) { + Widget build(BuildContext context, WidgetRef ref) { useNavigator([navigator]); - final state = useObservableState( - DetailModelStateData(), - () => model.getState(), - (current, newState) => (current as DetailModelStateData).equals(newState), - ).value; - - final event = useObservableState( - DetailModelEventData(), - () => model.getEvent(), - (current, newState) => (current as DetailModelEventData).equals(newState), - ).value; + final stateNotification = ref.watch(detailsPageStateProvider); + final state = stateNotification.state; + final eventNotification = ref.watch(detailsPageEventProvider); + final event = eventNotification.event; WidgetsBinding.instance.addPostFrameCallback((_) { - if (event.event == DetailModelEvent.saved) { - final snippetId = event.value; + if (event == DetailModelEvent.saved) { + final snippetId = eventNotification.value; if (snippetId == null) { _exit(); return; @@ -78,7 +73,7 @@ class _DetailsPage extends HookWidget { }); WidgetsBinding.instance.addPostFrameCallback((_) { - if (event.event == DetailModelEvent.deleted) { + if (event == DetailModelEvent.deleted) { _exit(); } }); @@ -91,7 +86,7 @@ class _DetailsPage extends HookWidget { return Scaffold( backgroundColor: ColorStyles.surfacePrimary(), appBar: AppBar( - title: Text(state.data?.title ?? ''), + title: Text(stateNotification.data?.title ?? ''), backgroundColor: ColorStyles.surfacePrimary(), foregroundColor: Colors.black, elevation: 0, @@ -99,15 +94,15 @@ class _DetailsPage extends HookWidget { onPressed: navigator.back, color: Colors.black, ), - actions: state.data?.isPrivate == true + actions: stateNotification.data?.isPrivate == true ? [const PaddingStyles.regular(Icon(Icons.lock_outlined))] : null, ), body: ViewStateWrapper( isLoading: - state.state == ModelState.loading || state.isLoading == true, - error: state.error, - data: state.data, + state == ModelState.loading || stateNotification.isLoading == true, + error: stateNotification.error, + data: stateNotification.data, builder: (_, snippet) => _DetailPageData( model: model, snippet: snippet, diff --git a/flutter_module/lib/presentation/screens/login_screen.dart b/flutter_module/lib/presentation/screens/login_screen.dart index d3a208c..a38f884 100644 --- a/flutter_module/lib/presentation/screens/login_screen.dart +++ b/flutter_module/lib/presentation/screens/login_screen.dart @@ -3,6 +3,7 @@ import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_module/generated/assets.dart'; import 'package:flutter_module/model/main_model.dart'; import 'package:flutter_module/presentation/navigation/login/login_navigator.dart'; +import 'package:flutter_module/presentation/providers/login_page_state_provider.dart'; import 'package:flutter_module/presentation/screens/named_screen.dart'; import 'package:flutter_module/presentation/styles/dimens.dart'; import 'package:flutter_module/presentation/styles/padding_styles.dart'; @@ -11,10 +12,9 @@ import 'package:flutter_module/presentation/widgets/login_input_card.dart'; import 'package:flutter_module/presentation/widgets/no_overscroll_single_child_scroll_view.dart'; import 'package:flutter_module/presentation/widgets/rounded_action_button.dart'; import 'package:flutter_module/presentation/widgets/view_state_wrapper.dart'; -import 'package:flutter_module/utils/extensions/state_extensions.dart'; import 'package:flutter_module/utils/hooks/use_navigator.dart'; -import 'package:flutter_module/utils/hooks/use_observable_state_hook.dart'; import 'package:go_router_plus/go_router_plus.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; class LoginScreen extends NamedScreen implements InitialScreen, GuestScreen { LoginScreen({ @@ -35,7 +35,7 @@ class LoginScreen extends NamedScreen implements InitialScreen, GuestScreen { } } -class _MainPage extends HookWidget { +class _MainPage extends HookConsumerWidget { const _MainPage({ required this.navigator, required this.model, @@ -45,24 +45,16 @@ class _MainPage extends HookWidget { final LoginModelBridge model; @override - Widget build(BuildContext context) { + Widget build(BuildContext context, WidgetRef ref) { useNavigator([navigator]); final email = useState('mail@o2.pl'); final password = useState('12345678'); final validationCorrect = useState(true); - final state = useObservableState( - LoginModelStateData(), - () => model.getState(), - (current, newState) => (current as LoginModelStateData).equals(newState), - ).value; - - final event = useObservableState( - LoginModelEventData(), - () => model.getEvent(), - (current, newState) => (current as LoginModelEventData).equals(newState), - ).value; + final stateNotification = ref.watch(loginPageStateProvider); + final eventNotification = ref.watch(loginPageEventProvider); + final event = eventNotification.event; useEffect(() { model.checkLoginState(); @@ -70,7 +62,7 @@ class _MainPage extends HookWidget { }, []); WidgetsBinding.instance.addPostFrameCallback((_) { - if (event.event == LoginModelEvent.logged) { + if (event == LoginModelEvent.logged) { model.resetEvent(); navigator.login(); } @@ -79,8 +71,8 @@ class _MainPage extends HookWidget { return Scaffold( body: SafeArea( child: ViewStateWrapper( - isLoading: state.state == ModelState.loading, - data: state.state, + isLoading: stateNotification.state == ModelState.loading, + data: stateNotification, builder: (BuildContext context, _) { return NoOverscrollSingleChildScrollView( child: Column( diff --git a/flutter_module/lib/presentation/screens/main_screen.dart b/flutter_module/lib/presentation/screens/main_screen.dart index 2c59a13..8e39a04 100644 --- a/flutter_module/lib/presentation/screens/main_screen.dart +++ b/flutter_module/lib/presentation/screens/main_screen.dart @@ -4,6 +4,7 @@ import 'package:flutter_module/generated/assets.dart'; import 'package:flutter_module/model/main_model.dart'; import 'package:flutter_module/presentation/navigation/details/details_navigator.dart'; import 'package:flutter_module/presentation/navigation/login/login_navigator.dart'; +import 'package:flutter_module/presentation/providers/main_page_state_provider.dart'; import 'package:flutter_module/presentation/screens/named_screen.dart'; import 'package:flutter_module/presentation/styles/color_styles.dart'; import 'package:flutter_module/presentation/styles/dimens.dart'; @@ -17,6 +18,7 @@ import 'package:flutter_module/utils/extensions/state_extensions.dart'; import 'package:flutter_module/utils/hooks/use_navigator.dart'; import 'package:flutter_module/utils/hooks/use_observable_state_hook.dart'; import 'package:go_router_plus/go_router_plus.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; class MainScreen extends NamedScreen implements UserScreen { MainScreen({ @@ -40,7 +42,7 @@ class MainScreen extends NamedScreen implements UserScreen { } } -class _MainPage extends HookWidget { +class _MainPage extends HookConsumerWidget { const _MainPage({ required this.loginNavigator, required this.detailsNavigator, @@ -52,32 +54,23 @@ class _MainPage extends HookWidget { final MainModelBridge model; @override - Widget build(BuildContext context) { + Widget build(BuildContext context, WidgetRef ref) { useNavigator([loginNavigator, detailsNavigator]); - - final state = useObservableState( - MainModelStateData(), - () => model.getState(), - (current, newState) => (current as MainModelStateData).equals(newState), - ).value; - - // Event - final event = useObservableState( - MainModelEventData(), - () => model.getEvent(), - (current, newState) => (current as MainModelEventData).equals(newState), - ).value; - final expandedState = useState(true); final controller = useScrollController(); + final stateNotification = ref.watch(mainPageStateProvider); + final state = stateNotification.state; + final eventNotification = ref.watch(mainPageEventProvider); + final event = eventNotification.event; + useEffect(() { model.initState(); return null; }, []); WidgetsBinding.instance.addPostFrameCallback((_) { - if (event.event == MainModelEvent.logout) { + if (event == MainModelEvent.logout) { model.resetEvent(); loginNavigator.logout(); } @@ -86,15 +79,15 @@ class _MainPage extends HookWidget { return Scaffold( backgroundColor: ColorStyles.pageBackground(), body: ViewStateWrapper>( - isLoading: state.state == ModelState.loading || state.isLoading == true, - error: state.error, - data: state.data?.cast(), + isLoading: state == ModelState.loading || stateNotification.isLoading == true, + error: stateNotification.error, + data: stateNotification.data?.cast(), builder: (_, snippets) { return _MainPageData( navigator: detailsNavigator, model: model, snippets: snippets ?? List.empty(), - filter: state.filter ?? SnippetFilter(), + filter: stateNotification.filter ?? SnippetFilter(), controller: controller, expanded: expandedState.value, onExpandChange: (expanded) => expandedState.value = expanded, diff --git a/flutter_module/pubspec.lock b/flutter_module/pubspec.lock index b75a528..e4bc463 100644 --- a/flutter_module/pubspec.lock +++ b/flutter_module/pubspec.lock @@ -230,6 +230,14 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.0" + flutter_riverpod: + dependency: "direct main" + description: + name: flutter_riverpod + sha256: "9532ee6db4a943a1ed8383072a2e3eeda041db5657cdf6d2acecf3c21ecbe7e1" + url: "https://pub.dev" + source: hosted + version: "2.6.1" flutter_test: dependency: "direct dev" description: flutter @@ -280,6 +288,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.2" + hooks_riverpod: + dependency: "direct main" + description: + name: hooks_riverpod + sha256: "70bba33cfc5670c84b796e6929c54b8bc5be7d0fe15bb28c2560500b9ad06966" + url: "https://pub.dev" + source: hosted + version: "2.6.1" http_multi_server: dependency: transitive description: @@ -456,6 +472,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.0" + riverpod: + dependency: transitive + description: + name: riverpod + sha256: "59062512288d3056b2321804332a13ffdd1bf16df70dcc8e506e411280a72959" + url: "https://pub.dev" + source: hosted + version: "2.6.1" + riverpod_annotation: + dependency: "direct main" + description: + name: riverpod_annotation + sha256: e14b0bf45b71326654e2705d462f21b958f987087be850afd60578fcd502d1b8 + url: "https://pub.dev" + source: hosted + version: "2.6.1" shelf: dependency: transitive description: @@ -525,6 +557,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.12.0" + state_notifier: + dependency: transitive + description: + name: state_notifier + sha256: b8677376aa54f2d7c58280d5a007f9e8774f1968d1fb1c096adcb4792fba29bb + url: "https://pub.dev" + source: hosted + version: "1.0.0" stream_channel: dependency: transitive description: diff --git a/flutter_module/pubspec.yaml b/flutter_module/pubspec.yaml index 231e2b9..7bd8e58 100644 --- a/flutter_module/pubspec.yaml +++ b/flutter_module/pubspec.yaml @@ -20,6 +20,13 @@ version: 1.0.0+1 environment: sdk: ">=3.0.0 <4.0.0" +scripts: + # run is a default script. To use it, simply type " in the command line: "rps" - that's all! + add: "fvm flutter pub add" + get: "fvm flutter pub get" + gen: "fvm flutter pub run build_runner build --delete-conflicting-outputs" + run: "fvm flutter run" + dependencies: flutter: sdk: flutter @@ -32,6 +39,8 @@ dependencies: collection: any logger: ^2.4.0 + flutter_riverpod: ^2.6.1 + hooks_riverpod: ^2.6.1 dev_dependencies: flutter_test: sdk: flutter