diff --git a/lib/main.dart b/lib/main.dart index 8a1038a..bf07ec5 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:flutter_mobx/flutter_mobx.dart'; import 'package:provider/provider.dart'; import 'presentation/pages/currently_playing.dart'; @@ -8,6 +9,7 @@ import 'presentation/pages/library_page.dart'; import 'presentation/pages/settings_page.dart'; import 'presentation/state/audio_store.dart'; import 'presentation/state/music_data_store.dart'; +import 'presentation/state/navigation_store.dart'; import 'presentation/theming.dart'; import 'presentation/widgets/audio_service_widget.dart'; import 'presentation/widgets/injection_widget.dart'; @@ -25,14 +27,14 @@ class MyApp extends StatelessWidget { return InjectionWidget( child: AudioServiceWidget( - child: MaterialApp( - title: 'mucke', - theme: theme(), - initialRoute: '/', - routes: { - '/': (context) => const RootPage(), - '/playing': (context) => const CurrentlyPlayingPage(), - }, + child: MaterialApp( + title: 'mucke', + theme: theme(), + initialRoute: '/', + routes: { + '/': (context) => const RootPage(), + '/playing': (context) => const CurrentlyPlayingPage(), + }, ), ), ); @@ -47,8 +49,6 @@ class RootPage extends StatefulWidget { } class _RootPageState extends State { - var navIndex = 1; - final List _pages = [ const HomePage(), const LibraryPage( @@ -79,19 +79,19 @@ class _RootPageState extends State { @override Widget build(BuildContext context) { + final NavigationStore navStore = Provider.of(context); + print('RootPage.build'); - return Scaffold( - body: IndexedStack( - index: navIndex, - children: _pages, - ), - bottomNavigationBar: NavBar( - onTap: (int index) { - setState(() { - navIndex = index; - }); - }, - currentIndex: navIndex, + return Observer( + builder: (BuildContext context) => Scaffold( + body: IndexedStack( + index: navStore.navIndex, + children: _pages, + ), + bottomNavigationBar: NavBar( + onTap: (int index) => navStore.setNavIndex(index), + currentIndex: navStore.navIndex, + ), ), ); } diff --git a/lib/presentation/pages/library_page.dart b/lib/presentation/pages/library_page.dart index cb6b957..d196d8b 100644 --- a/lib/presentation/pages/library_page.dart +++ b/lib/presentation/pages/library_page.dart @@ -1,5 +1,7 @@ import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import '../state/navigation_store.dart'; import 'library_tab_container.dart'; class LibraryPage extends StatelessWidget { @@ -10,6 +12,8 @@ class LibraryPage extends StatelessWidget { print('LibraryPage.build'); final GlobalKey nav = GlobalKey(); + final NavigationStore navStore = Provider.of(context); + return WillPopScope( child: Navigator( key: nav, @@ -27,8 +31,10 @@ class LibraryPage extends StatelessWidget { }, ), onWillPop: () async { - print('onWillPop'); - return !await nav.currentState.maybePop(); + if (navStore.navIndex == 1) { + return !await nav.currentState.maybePop(); + } + return Future.value(true); }, ); } diff --git a/lib/presentation/state/navigation_store.dart b/lib/presentation/state/navigation_store.dart new file mode 100644 index 0000000..6dd1390 --- /dev/null +++ b/lib/presentation/state/navigation_store.dart @@ -0,0 +1,28 @@ +import 'package:mobx/mobx.dart'; + +part 'navigation_store.g.dart'; + +class NavigationStore extends _NavigationStore with _$NavigationStore { + NavigationStore() : super(); +} + +abstract class _NavigationStore with Store { + _NavigationStore(); + + bool _initialized = false; + + @observable int navIndex = 1; + + @action + Future init() async { + if (!_initialized) { + print('NavigationStore.init'); + _initialized = true; + } + } + + @action + void setNavIndex(int i) { + navIndex = i; + } +} \ No newline at end of file diff --git a/lib/presentation/state/navigation_store.g.dart b/lib/presentation/state/navigation_store.g.dart new file mode 100644 index 0000000..26c5ba9 --- /dev/null +++ b/lib/presentation/state/navigation_store.g.dart @@ -0,0 +1,54 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'navigation_store.dart'; + +// ************************************************************************** +// StoreGenerator +// ************************************************************************** + +// ignore_for_file: non_constant_identifier_names, unnecessary_lambdas, prefer_expression_function_bodies, lines_longer_than_80_chars, avoid_as, avoid_annotating_with_dynamic + +mixin _$NavigationStore on _NavigationStore, Store { + final _$navIndexAtom = Atom(name: '_NavigationStore.navIndex'); + + @override + int get navIndex { + _$navIndexAtom.context.enforceReadPolicy(_$navIndexAtom); + _$navIndexAtom.reportObserved(); + return super.navIndex; + } + + @override + set navIndex(int value) { + _$navIndexAtom.context.conditionallyRunInAction(() { + super.navIndex = value; + _$navIndexAtom.reportChanged(); + }, _$navIndexAtom, name: '${_$navIndexAtom.name}_set'); + } + + final _$initAsyncAction = AsyncAction('init'); + + @override + Future init() { + return _$initAsyncAction.run(() => super.init()); + } + + final _$_NavigationStoreActionController = + ActionController(name: '_NavigationStore'); + + @override + void setNavIndex(int i) { + final _$actionInfo = _$_NavigationStoreActionController.startAction(); + try { + return super.setNavIndex(i); + } finally { + _$_NavigationStoreActionController.endAction(_$actionInfo); + } + } + + @override + String toString() { + final string = 'navIndex: ${navIndex.toString()}'; + return '{$string}'; + } +} diff --git a/lib/presentation/widgets/injection_widget.dart b/lib/presentation/widgets/injection_widget.dart index c11c0a5..d76cdb6 100644 --- a/lib/presentation/widgets/injection_widget.dart +++ b/lib/presentation/widgets/injection_widget.dart @@ -11,6 +11,7 @@ import '../../system/repositories/audio_repository_impl.dart'; import '../../system/repositories/music_data_repository_impl.dart'; import '../state/audio_store.dart'; import '../state/music_data_store.dart'; +import '../state/navigation_store.dart'; class InjectionWidget extends StatelessWidget { const InjectionWidget({Key key, this.child}) : super(key: key); @@ -44,6 +45,9 @@ class InjectionWidget extends StatelessWidget { audioRepository: audioRepository, ), ), + Provider( + create: (BuildContext context) => NavigationStore(), + ), ], ); } diff --git a/pubspec.lock b/pubspec.lock index 8a1c4ab..51ca268 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -28,21 +28,21 @@ packages: name: archive url: "https://pub.dartlang.org" source: hosted - version: "2.0.11" + version: "2.0.13" args: dependency: transitive description: name: args url: "https://pub.dartlang.org" source: hosted - version: "1.5.2" + version: "1.6.0" async: dependency: transitive description: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.4.0" + version: "2.4.1" audio_service: dependency: "direct main" description: @@ -56,7 +56,7 @@ packages: name: boolean_selector url: "https://pub.dartlang.org" source: hosted - version: "1.0.5" + version: "2.0.0" build: dependency: transitive description: @@ -119,7 +119,7 @@ packages: name: charcode url: "https://pub.dartlang.org" source: hosted - version: "1.1.2" + version: "1.1.3" checked_yaml: dependency: transitive description: @@ -147,7 +147,7 @@ packages: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.14.11" + version: "1.14.12" convert: dependency: transitive description: @@ -161,7 +161,7 @@ packages: name: crypto url: "https://pub.dartlang.org" source: hosted - version: "2.1.3" + version: "2.1.4" csslib: dependency: transitive description: @@ -288,7 +288,7 @@ packages: name: image url: "https://pub.dartlang.org" source: hosted - version: "2.1.4" + version: "2.1.12" io: dependency: transitive description: @@ -512,7 +512,7 @@ packages: name: quiver url: "https://pub.dartlang.org" source: hosted - version: "2.0.5" + version: "2.1.3" recase: dependency: transitive description: @@ -559,7 +559,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.5.5" + version: "1.7.0" sqlparser: dependency: transitive description: @@ -615,7 +615,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.2.11" + version: "0.2.15" timing: dependency: transitive description: @@ -664,7 +664,7 @@ packages: name: xml url: "https://pub.dartlang.org" source: hosted - version: "3.5.0" + version: "3.6.1" yaml: dependency: transitive description: