From 1ffbcb76ee7a3d0af319ccf13aff6c5bec3ea94a Mon Sep 17 00:00:00 2001 From: Festus Olusegun Date: Thu, 29 Jun 2023 22:24:21 +0300 Subject: [PATCH] feat: migrated to auto_route (#104) * feat: migrated to auto_route * rfac: code cleanup * rfac: replace Theme.of(context) with context.theme extension --- lib/main.dart | 14 +- lib/router.dart | 41 --- .../features/book_details/book_details.dart | 2 + lib/src/features/book_details/data/data.dart | 2 + .../book_details/data/notifier/notifiers.dart | 1 + .../data/repositories/repositories.dart | 1 + .../screens/book_details_screen.dart | 33 +-- .../book_details/screens/screens.dart | 1 + lib/src/features/common/common.dart | 5 + .../features/common/constants/constants.dart | 4 + lib/src/features/common/data/data.dart | 8 + .../favorites_local_data_source_impl.dart | 6 +- .../downloads/downloads_state_notifier.dart | 2 +- .../common/data/notifiers/notifiers.dart | 3 + .../common/data/providers/providers.dart | 3 + .../shared_preferences_provider.dart | 5 +- .../downloads_repository.dart | 0 .../data/repositories/repositories.dart | 3 + .../common/data/services/services.dart | 1 + .../features/common/database/database.dart | 1 + .../common/extensions/context_extensions.dart | 11 + .../common/extensions/extensions.dart | 2 + .../common/extensions/theme_extensions.dart | 6 + .../features/common/widgets/book_card.dart | 9 +- .../features/common/widgets/book_item.dart | 3 +- .../common/widgets/book_list_item.dart | 18 +- .../common/widgets/description_text.dart | 5 +- .../features/common/widgets/error_widget.dart | 5 +- .../common/widgets/loading_widget.dart | 3 +- .../widgets/modal_dialogs/download_alert.dart | 9 +- .../modal_dialogs/exit_modal_dialog.dart | 7 +- .../widgets/modal_dialogs/modal_dialogs.dart | 3 + lib/src/features/common/widgets/widgets.dart | 8 + lib/src/features/downloads/downloads.dart | 1 + .../downloads/screens/download_screen.dart | 15 +- .../features/downloads/screens/screens.dart | 1 + lib/src/features/explore/data/data.dart | 2 + .../genre_feed/genre_feed_state.dart | 0 .../genre_feed/genre_feed_state_notifier.dart | 4 +- .../genre_feed_state_notifier.freezed.dart | 0 .../explore/data/notifiers/notifiers.dart | 1 + .../repositories/explore_repository.dart | 0 .../data/repositories/repositories.dart | 1 + lib/src/features/explore/explore.dart | 2 + .../explore/screens/explore_screen.dart | 20 +- .../explore/screens/genre_screen.dart | 8 +- lib/src/features/explore/screens/screens.dart | 2 + lib/src/features/favorites/favourites.dart | 1 + .../favorites/screens/favorites_screen.dart | 7 +- .../features/favorites/screens/screens.dart | 1 + lib/src/features/features.dart | 9 + lib/src/features/home/data/data.dart | 2 + .../home/data/notifiers/notifiers.dart | 1 + .../home/data/repositories/repositories.dart | 1 + lib/src/features/home/home.dart | 2 + .../features/home/screens/home_screen.dart | 26 +- lib/src/features/home/screens/screens.dart | 1 + .../features/settings/screens/screens.dart | 1 + .../settings/screens/settings_screen.dart | 32 +- lib/src/features/settings/settings.dart | 1 + lib/src/features/splash/screens/screens.dart | 1 + .../splash/screens/splash_screen.dart | 7 +- lib/src/features/splash/splash.dart | 1 + lib/src/features/tabs/data/data.dart | 1 + .../tabs/data/notifiers/notifiers.dart | 1 + lib/src/features/tabs/screens/screens.dart | 1 + .../features/tabs/screens/tabs_screen.dart | 51 ++-- lib/src/features/tabs/tabs.dart | 2 + lib/src/router/app_router.dart | 56 ++++ lib/src/router/app_router.gr.dart | 278 ++++++++++++++++++ lib/{ => src}/theme/theme_config.dart | 0 pubspec.lock | 24 +- pubspec.yaml | 4 +- 73 files changed, 586 insertions(+), 208 deletions(-) delete mode 100644 lib/router.dart create mode 100644 lib/src/features/book_details/book_details.dart create mode 100644 lib/src/features/book_details/data/data.dart create mode 100644 lib/src/features/book_details/data/notifier/notifiers.dart create mode 100644 lib/src/features/book_details/data/repositories/repositories.dart create mode 100644 lib/src/features/book_details/screens/screens.dart create mode 100644 lib/src/features/common/common.dart create mode 100644 lib/src/features/common/constants/constants.dart create mode 100644 lib/src/features/common/data/data.dart create mode 100644 lib/src/features/common/data/notifiers/notifiers.dart create mode 100644 lib/src/features/common/data/providers/providers.dart rename lib/src/features/common/data/repositories/{dowloads => downloads}/downloads_repository.dart (100%) create mode 100644 lib/src/features/common/data/repositories/repositories.dart create mode 100644 lib/src/features/common/data/services/services.dart create mode 100644 lib/src/features/common/database/database.dart create mode 100644 lib/src/features/common/extensions/context_extensions.dart create mode 100644 lib/src/features/common/extensions/extensions.dart create mode 100644 lib/src/features/common/extensions/theme_extensions.dart create mode 100644 lib/src/features/common/widgets/modal_dialogs/modal_dialogs.dart create mode 100644 lib/src/features/common/widgets/widgets.dart create mode 100644 lib/src/features/downloads/downloads.dart create mode 100644 lib/src/features/downloads/screens/screens.dart create mode 100644 lib/src/features/explore/data/data.dart rename lib/src/features/explore/{ => data}/notifiers/genre_feed/genre_feed_state.dart (100%) rename lib/src/features/explore/{ => data}/notifiers/genre_feed/genre_feed_state_notifier.dart (92%) rename lib/src/features/explore/{ => data}/notifiers/genre_feed/genre_feed_state_notifier.freezed.dart (100%) create mode 100644 lib/src/features/explore/data/notifiers/notifiers.dart rename lib/src/features/explore/{ => data}/repositories/explore_repository.dart (100%) create mode 100644 lib/src/features/explore/data/repositories/repositories.dart create mode 100644 lib/src/features/explore/explore.dart create mode 100644 lib/src/features/explore/screens/screens.dart create mode 100644 lib/src/features/favorites/favourites.dart create mode 100644 lib/src/features/favorites/screens/screens.dart create mode 100644 lib/src/features/features.dart create mode 100644 lib/src/features/home/data/data.dart create mode 100644 lib/src/features/home/data/notifiers/notifiers.dart create mode 100644 lib/src/features/home/data/repositories/repositories.dart create mode 100644 lib/src/features/home/home.dart create mode 100644 lib/src/features/home/screens/screens.dart create mode 100644 lib/src/features/settings/screens/screens.dart create mode 100644 lib/src/features/settings/settings.dart create mode 100644 lib/src/features/splash/screens/screens.dart create mode 100644 lib/src/features/splash/splash.dart create mode 100644 lib/src/features/tabs/data/data.dart create mode 100644 lib/src/features/tabs/data/notifiers/notifiers.dart create mode 100644 lib/src/features/tabs/screens/screens.dart create mode 100644 lib/src/features/tabs/tabs.dart create mode 100644 lib/src/router/app_router.dart create mode 100644 lib/src/router/app_router.gr.dart rename lib/{ => src}/theme/theme_config.dart (100%) diff --git a/lib/main.dart b/lib/main.dart index e810d04a..bd76611a 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -3,8 +3,8 @@ import 'package:flutter_ebook_app/src/features/common/constants/strings.dart'; import 'package:flutter_ebook_app/src/features/common/data/local/local_storage.dart'; import 'package:flutter_ebook_app/src/features/common/data/notifiers/current_app_theme/current_app_theme_state_notifier.dart'; import 'package:flutter_ebook_app/src/features/common/database/database_config.dart'; -import 'package:flutter_ebook_app/theme/theme_config.dart'; -import 'package:flutter_ebook_app/src/features/splash/screens/splash_screen.dart'; +import 'package:flutter_ebook_app/src/router/app_router.dart'; +import 'package:flutter_ebook_app/src/theme/theme_config.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:sembast/sembast.dart'; @@ -13,16 +13,18 @@ void main() async { WidgetsFlutterBinding.ensureInitialized(); LocalStorage(); await DatabaseConfig.init(StoreRef.main()); - runApp(const ProviderScope(child: MyApp())); + runApp(ProviderScope(child: MyApp())); } class MyApp extends ConsumerWidget { - const MyApp({super.key}); + MyApp({super.key}); + + final _appRouter = AppRouter(); @override Widget build(BuildContext context, WidgetRef ref) { final currentAppTheme = ref.watch(currentAppThemeStateNotifierProvider); - return MaterialApp( + return MaterialApp.router( debugShowCheckedModeBanner: false, title: Strings.appName, theme: themeData( @@ -31,7 +33,7 @@ class MyApp extends ConsumerWidget { : ThemeConfig.lightTheme, ), darkTheme: themeData(ThemeConfig.darkTheme), - home: const SplashScreen(), + routerConfig: _appRouter.config(), ); } diff --git a/lib/router.dart b/lib/router.dart deleted file mode 100644 index d5c4cde0..00000000 --- a/lib/router.dart +++ /dev/null @@ -1,41 +0,0 @@ -import 'package:flutter/material.dart'; - -class MyRouter { - static Future pushPage(BuildContext context, Widget page) { - var val = Navigator.push( - context, - MaterialPageRoute( - builder: (BuildContext context) { - return page; - }, - ), - ); - - return val; - } - - static Future pushPageDialog(BuildContext context, Widget page) { - var val = Navigator.push( - context, - MaterialPageRoute( - builder: (BuildContext context) { - return page; - }, - fullscreenDialog: true, - ), - ); - - return val; - } - - static void pushPageReplacement(BuildContext context, Widget page) { - Navigator.pushReplacement( - context, - MaterialPageRoute( - builder: (BuildContext context) { - return page; - }, - ), - ); - } -} diff --git a/lib/src/features/book_details/book_details.dart b/lib/src/features/book_details/book_details.dart new file mode 100644 index 00000000..7f26dbd7 --- /dev/null +++ b/lib/src/features/book_details/book_details.dart @@ -0,0 +1,2 @@ +export 'screens/screens.dart'; +export 'data/data.dart'; diff --git a/lib/src/features/book_details/data/data.dart b/lib/src/features/book_details/data/data.dart new file mode 100644 index 00000000..283a3b3d --- /dev/null +++ b/lib/src/features/book_details/data/data.dart @@ -0,0 +1,2 @@ +export 'notifier/notifiers.dart'; +export 'repositories/repositories.dart'; diff --git a/lib/src/features/book_details/data/notifier/notifiers.dart b/lib/src/features/book_details/data/notifier/notifiers.dart new file mode 100644 index 00000000..33f1e472 --- /dev/null +++ b/lib/src/features/book_details/data/notifier/notifiers.dart @@ -0,0 +1 @@ +export 'book_details_state_notifier.dart'; diff --git a/lib/src/features/book_details/data/repositories/repositories.dart b/lib/src/features/book_details/data/repositories/repositories.dart new file mode 100644 index 00000000..32c4d0aa --- /dev/null +++ b/lib/src/features/book_details/data/repositories/repositories.dart @@ -0,0 +1 @@ +export 'book_details_repository.dart'; diff --git a/lib/src/features/book_details/screens/book_details_screen.dart b/lib/src/features/book_details/screens/book_details_screen.dart index 6c6c4517..e3cdb3f3 100644 --- a/lib/src/features/book_details/screens/book_details_screen.dart +++ b/lib/src/features/book_details/screens/book_details_screen.dart @@ -1,22 +1,15 @@ import 'dart:io'; +import 'package:auto_route/auto_route.dart'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_ebook_app/src/features/common/data/notifiers/favorites/favorites_state_notifier.dart'; -import 'package:flutter_ebook_app/src/features/common/widgets/error_widget.dart'; -import 'package:flutter_ebook_app/src/features/common/widgets/modal_dialogs/download_alert.dart'; -import 'package:flutter_ebook_app/src/features/common/widgets/loading_widget.dart'; -import 'package:flutter_ebook_app/src/features/book_details/data/notifier/book_details_state_notifier.dart'; -import 'package:flutter_ebook_app/src/features/common/data/models/category_feed.dart'; -import 'package:flutter_ebook_app/src/features/common/data/notifiers/downloads/downloads_state_notifier.dart'; -import 'package:flutter_ebook_app/src/features/common/widgets/book_list_item.dart'; -import 'package:flutter_ebook_app/src/features/common/widgets/description_text.dart'; -import 'package:flutter_ebook_app/router.dart'; import 'package:flutter_icons/flutter_icons.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:iridium_reader_widget/views/viewers/epub_screen.dart'; import 'package:share_plus/share_plus.dart'; +import 'package:flutter_ebook_app/src/features/features.dart'; +@RoutePage() class BookDetailsScreen extends ConsumerStatefulWidget { final Entry entry; final String imgTag; @@ -73,7 +66,7 @@ class _BookDetailsScreenState extends ConsumerState { favorited ? Icons.favorite : Feather.heart, color: favorited ? Colors.red - : Theme.of(context).iconTheme.color, + : context.theme.iconTheme.color, ), ); }, @@ -126,7 +119,7 @@ class _Divider extends StatelessWidget { @override Widget build(BuildContext context) { - return Divider(color: Theme.of(context).textTheme.bodySmall!.color); + return Divider(color: context.theme.textTheme.bodySmall!.color); } } @@ -238,7 +231,7 @@ class _CategoryChips extends StatelessWidget { color: Colors.transparent, borderRadius: const BorderRadius.all(Radius.circular(20)), border: Border.all( - color: Theme.of(context).colorScheme.secondary, + color: context.theme.colorScheme.secondary, ), ), child: Padding( @@ -249,7 +242,7 @@ class _CategoryChips extends StatelessWidget { child: Text( '${category.label}', style: TextStyle( - color: Theme.of(context).colorScheme.secondary, + color: context.theme.colorScheme.secondary, fontSize: 12.0, fontWeight: FontWeight.bold, ), @@ -292,7 +285,7 @@ class _DownloadButton extends ConsumerWidget { style: TextStyle( fontSize: 15, color: - Theme.of(context).textTheme.titleLarge?.color ?? Colors.black, + context.theme.textTheme.titleLarge?.color ?? Colors.black, ), ), ); @@ -315,7 +308,7 @@ class _DownloadButton extends ConsumerWidget { style: TextStyle( fontSize: 15, color: - Theme.of(context).textTheme.titleLarge?.color ?? Colors.black, + context.theme.textTheme.titleLarge?.color ?? Colors.black, ), ), ); @@ -327,14 +320,16 @@ class _DownloadButton extends ConsumerWidget { ) async { File bookFile = File(path); if (bookFile.existsSync()) { - MyRouter.pushPage(context, EpubScreen.fromPath(filePath: path)); + MaterialPageRoute(builder: (_) { + return EpubScreen.fromPath(filePath: path); + }); } else { const snackBar = SnackBar( content: Text( 'Could not find the book file. Please download it again.', ), ); - ScaffoldMessenger.of(context).showSnackBar(snackBar); + context.showSnackBar(snackBar); ref.read(downloadsStateNotifierProvider.notifier).deleteBook(id); } } @@ -350,7 +345,7 @@ class _SectionTitle extends StatelessWidget { return Text( title, style: TextStyle( - color: Theme.of(context).colorScheme.secondary, + color: context.theme.colorScheme.secondary, fontSize: 20.0, fontWeight: FontWeight.bold, ), diff --git a/lib/src/features/book_details/screens/screens.dart b/lib/src/features/book_details/screens/screens.dart new file mode 100644 index 00000000..f12a5146 --- /dev/null +++ b/lib/src/features/book_details/screens/screens.dart @@ -0,0 +1 @@ +export 'book_details_screen.dart'; diff --git a/lib/src/features/common/common.dart b/lib/src/features/common/common.dart new file mode 100644 index 00000000..d53f1253 --- /dev/null +++ b/lib/src/features/common/common.dart @@ -0,0 +1,5 @@ +export 'widgets/widgets.dart'; +export 'database/database.dart'; +export 'data/data.dart'; +export 'extensions/extensions.dart'; +export 'constants/constants.dart'; diff --git a/lib/src/features/common/constants/constants.dart b/lib/src/features/common/constants/constants.dart new file mode 100644 index 00000000..0364cc84 --- /dev/null +++ b/lib/src/features/common/constants/constants.dart @@ -0,0 +1,4 @@ +export 'api.dart'; +export 'shared_preferences_key.dart'; +export 'strings.dart'; +export 'utils.dart'; diff --git a/lib/src/features/common/data/data.dart b/lib/src/features/common/data/data.dart new file mode 100644 index 00000000..2b25dad2 --- /dev/null +++ b/lib/src/features/common/data/data.dart @@ -0,0 +1,8 @@ +export 'services/services.dart'; +export 'repositories/repositories.dart'; +export 'remote/app_dio.dart'; +export 'providers/providers.dart'; +export 'notifiers/notifiers.dart'; +export 'models/category_feed.dart'; +export 'local/local_storage.dart'; +export 'failures/http_failure.dart'; diff --git a/lib/src/features/common/data/data_sources/favorites/favorites_local_data_source_impl.dart b/lib/src/features/common/data/data_sources/favorites/favorites_local_data_source_impl.dart index 92415042..684e1f1d 100644 --- a/lib/src/features/common/data/data_sources/favorites/favorites_local_data_source_impl.dart +++ b/lib/src/features/common/data/data_sources/favorites/favorites_local_data_source_impl.dart @@ -18,6 +18,7 @@ class FavoritesLocalDataSourceImpl implements FavoritesLocalDataSource { Future addBook(Entry book, String id) async { await _store.record(id).put(_database, book.toJson()); } + @override Future deleteBook(String id) async { await _store.record(id).delete(_database); @@ -25,10 +26,7 @@ class FavoritesLocalDataSourceImpl implements FavoritesLocalDataSource { @override Stream> favoritesListStream() { - return _store - .query() - .onSnapshots(_database) - .map>( + return _store.query().onSnapshots(_database).map>( (records) => records .map((record) => Entry.fromJson(record.value)) .toList(), diff --git a/lib/src/features/common/data/notifiers/downloads/downloads_state_notifier.dart b/lib/src/features/common/data/notifiers/downloads/downloads_state_notifier.dart index 62ecd416..a12aaa83 100644 --- a/lib/src/features/common/data/notifiers/downloads/downloads_state_notifier.dart +++ b/lib/src/features/common/data/notifiers/downloads/downloads_state_notifier.dart @@ -1,6 +1,6 @@ import 'dart:async'; -import 'package:flutter_ebook_app/src/features/common/data/repositories/dowloads/downloads_repository.dart'; +import 'package:flutter_ebook_app/src/features/common/data/repositories/downloads/downloads_repository.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; diff --git a/lib/src/features/common/data/notifiers/notifiers.dart b/lib/src/features/common/data/notifiers/notifiers.dart new file mode 100644 index 00000000..db541ff6 --- /dev/null +++ b/lib/src/features/common/data/notifiers/notifiers.dart @@ -0,0 +1,3 @@ +export 'current_app_theme/current_app_theme_state_notifier.dart'; +export 'downloads/downloads_state_notifier.dart'; +export 'favorites/favorites_state_notifier.dart'; diff --git a/lib/src/features/common/data/providers/providers.dart b/lib/src/features/common/data/providers/providers.dart new file mode 100644 index 00000000..f414f944 --- /dev/null +++ b/lib/src/features/common/data/providers/providers.dart @@ -0,0 +1,3 @@ +export 'database_provider.dart'; +export 'dio_provider.dart'; +export 'shared_preferences_provider.dart'; diff --git a/lib/src/features/common/data/providers/shared_preferences_provider.dart b/lib/src/features/common/data/providers/shared_preferences_provider.dart index 939ef1b2..2f8c788d 100644 --- a/lib/src/features/common/data/providers/shared_preferences_provider.dart +++ b/lib/src/features/common/data/providers/shared_preferences_provider.dart @@ -2,5 +2,6 @@ import 'package:flutter_ebook_app/src/features/common/data/local/local_storage.d import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:shared_preferences/shared_preferences.dart'; -final sharedPreferencesProvider = - Provider((_) => LocalStorage().getSharedPreferences()!); +final sharedPreferencesProvider = Provider( + (_) => LocalStorage().getSharedPreferences()!, +); diff --git a/lib/src/features/common/data/repositories/dowloads/downloads_repository.dart b/lib/src/features/common/data/repositories/downloads/downloads_repository.dart similarity index 100% rename from lib/src/features/common/data/repositories/dowloads/downloads_repository.dart rename to lib/src/features/common/data/repositories/downloads/downloads_repository.dart diff --git a/lib/src/features/common/data/repositories/repositories.dart b/lib/src/features/common/data/repositories/repositories.dart new file mode 100644 index 00000000..aad81ae9 --- /dev/null +++ b/lib/src/features/common/data/repositories/repositories.dart @@ -0,0 +1,3 @@ +export 'book/book_repository.dart'; +export 'downloads/downloads_repository.dart'; +export 'favorites/favorites_repository.dart'; diff --git a/lib/src/features/common/data/services/services.dart b/lib/src/features/common/data/services/services.dart new file mode 100644 index 00000000..a57553b3 --- /dev/null +++ b/lib/src/features/common/data/services/services.dart @@ -0,0 +1 @@ +export 'current_app_theme_service.dart'; diff --git a/lib/src/features/common/database/database.dart b/lib/src/features/common/database/database.dart new file mode 100644 index 00000000..1ce8e193 --- /dev/null +++ b/lib/src/features/common/database/database.dart @@ -0,0 +1 @@ +export 'database_config.dart'; diff --git a/lib/src/features/common/extensions/context_extensions.dart b/lib/src/features/common/extensions/context_extensions.dart new file mode 100644 index 00000000..ee70b8d9 --- /dev/null +++ b/lib/src/features/common/extensions/context_extensions.dart @@ -0,0 +1,11 @@ +import 'package:flutter/material.dart'; + +extension BuildContextExtensions on BuildContext { + ThemeData get theme => Theme.of(this); + Size get screenSize => MediaQuery.sizeOf(this); + EdgeInsets get screenPadding => MediaQuery.paddingOf(this); + double get screenTextScaleFactor => MediaQuery.textScaleFactorOf(this); + void showSnackBar(SnackBar snackBar) { + ScaffoldMessenger.of(this).showSnackBar(snackBar); + } +} diff --git a/lib/src/features/common/extensions/extensions.dart b/lib/src/features/common/extensions/extensions.dart new file mode 100644 index 00000000..9c02d91a --- /dev/null +++ b/lib/src/features/common/extensions/extensions.dart @@ -0,0 +1,2 @@ +export 'context_extensions.dart'; +export 'theme_extensions.dart'; diff --git a/lib/src/features/common/extensions/theme_extensions.dart b/lib/src/features/common/extensions/theme_extensions.dart new file mode 100644 index 00000000..1c373904 --- /dev/null +++ b/lib/src/features/common/extensions/theme_extensions.dart @@ -0,0 +1,6 @@ +import 'package:flutter/material.dart'; + +extension ThemeExtensions on ThemeData { + Color get accentColor => colorScheme.secondary; + bool get isDark => brightness == Brightness.dark; +} diff --git a/lib/src/features/common/widgets/book_card.dart b/lib/src/features/common/widgets/book_card.dart index 7fd5d6ef..7348cbb9 100644 --- a/lib/src/features/common/widgets/book_card.dart +++ b/lib/src/features/common/widgets/book_card.dart @@ -1,9 +1,9 @@ +import 'package:auto_route/auto_route.dart'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:flutter_ebook_app/src/features/common/widgets/loading_widget.dart'; -import 'package:flutter_ebook_app/src/features/book_details/screens/book_details_screen.dart'; import 'package:flutter_ebook_app/src/features/common/data/models/category_feed.dart'; -import 'package:flutter_ebook_app/router.dart'; +import 'package:flutter_ebook_app/src/router/app_router.dart'; import 'package:uuid/uuid.dart'; class BookCard extends StatelessWidget { @@ -33,9 +33,8 @@ class BookCard extends StatelessWidget { child: InkWell( borderRadius: const BorderRadius.all(Radius.circular(10.0)), onTap: () { - MyRouter.pushPage( - context, - BookDetailsScreen( + context.router.push( + BookDetailsRoute( entry: entry, imgTag: imgTag, titleTag: titleTag, diff --git a/lib/src/features/common/widgets/book_item.dart b/lib/src/features/common/widgets/book_item.dart index 8f0dfdb6..f404c401 100644 --- a/lib/src/features/common/widgets/book_item.dart +++ b/lib/src/features/common/widgets/book_item.dart @@ -6,7 +6,6 @@ import 'package:flutter_ebook_app/src/features/common/widgets/loading_widget.dar import 'package:iridium_reader_widget/util/router.dart'; import 'package:uuid/uuid.dart'; - class BookItem extends StatelessWidget { final String img; final String title; @@ -81,4 +80,4 @@ class BookItem extends StatelessWidget { ), ); } -} \ No newline at end of file +} diff --git a/lib/src/features/common/widgets/book_list_item.dart b/lib/src/features/common/widgets/book_list_item.dart index 7367efeb..d9e93a2e 100644 --- a/lib/src/features/common/widgets/book_list_item.dart +++ b/lib/src/features/common/widgets/book_list_item.dart @@ -1,9 +1,8 @@ +import 'package:auto_route/auto_route.dart'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_ebook_app/src/features/common/widgets/loading_widget.dart'; -import 'package:flutter_ebook_app/src/features/book_details/screens/book_details_screen.dart'; -import 'package:flutter_ebook_app/src/features/common/data/models/category_feed.dart'; -import 'package:flutter_ebook_app/router.dart'; +import 'package:flutter_ebook_app/src/features/features.dart'; +import 'package:flutter_ebook_app/src/router/app_router.dart'; import 'package:uuid/uuid.dart'; class BookListItem extends StatelessWidget { @@ -23,9 +22,8 @@ class BookListItem extends StatelessWidget { Widget build(BuildContext context) { return InkWell( onTap: () { - MyRouter.pushPage( - context, - BookDetailsScreen( + context.router.push( + BookDetailsRoute( entry: entry, imgTag: imgTag, titleTag: titleTag, @@ -86,7 +84,7 @@ class BookListItem extends StatelessWidget { style: TextStyle( fontSize: 17.0, fontWeight: FontWeight.bold, - color: Theme.of(context).textTheme.titleLarge!.color, + color: context.theme.textTheme.titleLarge!.color, ), maxLines: 2, overflow: TextOverflow.ellipsis, @@ -103,7 +101,7 @@ class BookListItem extends StatelessWidget { style: TextStyle( fontSize: 14.0, fontWeight: FontWeight.w800, - color: Theme.of(context).colorScheme.secondary, + color: context.theme.colorScheme.secondary, ), ), ), @@ -116,7 +114,7 @@ class BookListItem extends StatelessWidget { .replaceAll(r'\"', '"'), style: TextStyle( fontSize: 13.0, - color: Theme.of(context).textTheme.bodySmall!.color, + color: context.theme.textTheme.bodySmall!.color, ), ), ], diff --git a/lib/src/features/common/widgets/description_text.dart b/lib/src/features/common/widgets/description_text.dart index 7f589bfb..21e3bc9d 100644 --- a/lib/src/features/common/widgets/description_text.dart +++ b/lib/src/features/common/widgets/description_text.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter_ebook_app/src/features/features.dart'; class DescriptionTextWidget extends StatefulWidget { final String text; @@ -39,7 +40,7 @@ class _DescriptionTextWidgetState extends State { .replaceAll(r"\'", "'"), style: TextStyle( fontSize: 16.0, - color: Theme.of(context).textTheme.bodySmall!.color, + color: context.theme.textTheme.bodySmall!.color, ), ) : Column( @@ -51,7 +52,7 @@ class _DescriptionTextWidgetState extends State { .replaceAll(r"\'", "'"), style: TextStyle( fontSize: 16.0, - color: Theme.of(context).textTheme.bodySmall!.color, + color: context.theme.textTheme.bodySmall!.color, ), ), InkWell( diff --git a/lib/src/features/common/widgets/error_widget.dart b/lib/src/features/common/widgets/error_widget.dart index 5b47c29d..8694f8c2 100644 --- a/lib/src/features/common/widgets/error_widget.dart +++ b/lib/src/features/common/widgets/error_widget.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter_ebook_app/src/features/features.dart'; class MyErrorWidget extends StatelessWidget { final Function refreshCallBack; @@ -30,7 +31,7 @@ class MyErrorWidget extends StatelessWidget { getErrorText(), textAlign: TextAlign.center, style: TextStyle( - color: Theme.of(context).textTheme.titleLarge!.color, + color: context.theme.textTheme.titleLarge!.color, fontSize: 17.0, fontWeight: FontWeight.w700, ), @@ -42,7 +43,7 @@ class MyErrorWidget extends StatelessWidget { shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(5.0), ), - backgroundColor: Theme.of(context).colorScheme.secondary, + backgroundColor: context.theme.colorScheme.secondary, ), child: const Text( 'TRY AGAIN', diff --git a/lib/src/features/common/widgets/loading_widget.dart b/lib/src/features/common/widgets/loading_widget.dart index f511d483..aafd7fa0 100644 --- a/lib/src/features/common/widgets/loading_widget.dart +++ b/lib/src/features/common/widgets/loading_widget.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter_ebook_app/src/features/features.dart'; import 'package:flutter_spinkit/flutter_spinkit.dart'; class LoadingWidget extends StatelessWidget { @@ -8,7 +9,7 @@ class LoadingWidget extends StatelessWidget { @override Widget build(BuildContext context) { - Color color = Theme.of(context).colorScheme.secondary; + Color color = context.theme.colorScheme.secondary; return Center( child: isImage ? SpinKitRipple(color: color) : SpinKitWave(color: color), ); diff --git a/lib/src/features/common/widgets/modal_dialogs/download_alert.dart b/lib/src/features/common/widgets/modal_dialogs/download_alert.dart index bac2dde6..44d83bca 100644 --- a/lib/src/features/common/widgets/modal_dialogs/download_alert.dart +++ b/lib/src/features/common/widgets/modal_dialogs/download_alert.dart @@ -2,10 +2,7 @@ import 'dart:io'; import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_ebook_app/src/features/common/constants/strings.dart'; -import 'package:flutter_ebook_app/src/features/common/constants/utils.dart'; -import 'package:flutter_ebook_app/src/features/common/widgets/modal_dialogs/custom_alert.dart'; -import 'package:flutter_ebook_app/src/features/common/data/notifiers/downloads/downloads_state_notifier.dart'; +import 'package:flutter_ebook_app/src/features/features.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:path_provider/path_provider.dart'; import 'package:permission_handler/permission_handler.dart'; @@ -169,10 +166,10 @@ class _DownloadAlertState extends ConsumerState { child: LinearProgressIndicator( value: double.parse(progress) / 100.0, valueColor: AlwaysStoppedAnimation( - Theme.of(context).colorScheme.secondary, + context.theme.colorScheme.secondary, ), backgroundColor: - Theme.of(context).colorScheme.secondary.withOpacity(0.3), + context.theme.colorScheme.secondary.withOpacity(0.3), ), ), const SizedBox(height: 5.0), diff --git a/lib/src/features/common/widgets/modal_dialogs/exit_modal_dialog.dart b/lib/src/features/common/widgets/modal_dialogs/exit_modal_dialog.dart index 8bbf370d..4943c079 100644 --- a/lib/src/features/common/widgets/modal_dialogs/exit_modal_dialog.dart +++ b/lib/src/features/common/widgets/modal_dialogs/exit_modal_dialog.dart @@ -1,8 +1,7 @@ import 'dart:io'; import 'package:flutter/material.dart'; -import 'package:flutter_ebook_app/src/features/common/constants/strings.dart'; -import 'package:flutter_ebook_app/src/features/common/widgets/modal_dialogs/custom_alert.dart'; +import 'package:flutter_ebook_app/src/features/features.dart'; class ExitModalDialog extends StatelessWidget { const ExitModalDialog({Key? key}) : super(key: key); @@ -51,7 +50,7 @@ class ExitModalDialog extends StatelessWidget { child: Text( 'No', style: TextStyle( - color: Theme.of(context).colorScheme.secondary, + color: context.theme.colorScheme.secondary, ), ), onPressed: () => Navigator.pop(context), @@ -65,7 +64,7 @@ class ExitModalDialog extends StatelessWidget { shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(5.0), ), - backgroundColor: Theme.of(context).colorScheme.secondary, + backgroundColor: context.theme.colorScheme.secondary, ), child: const Text( 'Yes', diff --git a/lib/src/features/common/widgets/modal_dialogs/modal_dialogs.dart b/lib/src/features/common/widgets/modal_dialogs/modal_dialogs.dart new file mode 100644 index 00000000..e853d9a2 --- /dev/null +++ b/lib/src/features/common/widgets/modal_dialogs/modal_dialogs.dart @@ -0,0 +1,3 @@ +export 'custom_alert.dart'; +export 'download_alert.dart'; +export 'exit_modal_dialog.dart'; diff --git a/lib/src/features/common/widgets/widgets.dart b/lib/src/features/common/widgets/widgets.dart new file mode 100644 index 00000000..7a7ba44b --- /dev/null +++ b/lib/src/features/common/widgets/widgets.dart @@ -0,0 +1,8 @@ +export 'book_card.dart'; +export 'book_item.dart'; +export 'book_list_item.dart'; +export 'description_text.dart'; +export 'empty_view.dart'; +export 'error_widget.dart'; +export 'loading_widget.dart'; +export 'modal_dialogs/modal_dialogs.dart'; diff --git a/lib/src/features/downloads/downloads.dart b/lib/src/features/downloads/downloads.dart new file mode 100644 index 00000000..80f5a18c --- /dev/null +++ b/lib/src/features/downloads/downloads.dart @@ -0,0 +1 @@ +export 'screens/screens.dart'; diff --git a/lib/src/features/downloads/screens/download_screen.dart b/lib/src/features/downloads/screens/download_screen.dart index 2bf13709..4d1e4515 100644 --- a/lib/src/features/downloads/screens/download_screen.dart +++ b/lib/src/features/downloads/screens/download_screen.dart @@ -1,14 +1,13 @@ +import 'package:auto_route/auto_route.dart'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_ebook_app/src/features/common/widgets/loading_widget.dart'; -import 'package:flutter_ebook_app/src/features/common/data/notifiers/downloads/downloads_state_notifier.dart'; -import 'package:flutter_ebook_app/src/features/common/widgets/empty_view.dart'; -import 'package:flutter_ebook_app/router.dart'; +import 'package:flutter_ebook_app/src/features/features.dart'; import 'package:flutter_icons/flutter_icons.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:iridium_reader_widget/views/viewers/epub_screen.dart'; import 'package:uuid/uuid.dart'; +@RoutePage() class DownloadsScreen extends ConsumerStatefulWidget { const DownloadsScreen({Key? key}) : super(key: key); @@ -59,9 +58,11 @@ class _DownloadsScreenState extends ConsumerState { onTap: () async { String path = book['path']; - MyRouter.pushPage( + Navigator.push( context, - EpubScreen.fromPath(filePath: path), + MaterialPageRoute(builder: (_) { + return EpubScreen.fromPath(filePath: path); + }), ); }, child: Padding( @@ -110,7 +111,7 @@ class _DownloadsScreenState extends ConsumerState { style: TextStyle( fontSize: 13.0, fontWeight: FontWeight.bold, - color: Theme.of(context) + color: context.theme .colorScheme .secondary, ), diff --git a/lib/src/features/downloads/screens/screens.dart b/lib/src/features/downloads/screens/screens.dart new file mode 100644 index 00000000..34a66403 --- /dev/null +++ b/lib/src/features/downloads/screens/screens.dart @@ -0,0 +1 @@ +export 'download_screen.dart'; diff --git a/lib/src/features/explore/data/data.dart b/lib/src/features/explore/data/data.dart new file mode 100644 index 00000000..1b91d0a0 --- /dev/null +++ b/lib/src/features/explore/data/data.dart @@ -0,0 +1,2 @@ +export 'repositories/repositories.dart'; +export 'notifiers/notifiers.dart'; diff --git a/lib/src/features/explore/notifiers/genre_feed/genre_feed_state.dart b/lib/src/features/explore/data/notifiers/genre_feed/genre_feed_state.dart similarity index 100% rename from lib/src/features/explore/notifiers/genre_feed/genre_feed_state.dart rename to lib/src/features/explore/data/notifiers/genre_feed/genre_feed_state.dart diff --git a/lib/src/features/explore/notifiers/genre_feed/genre_feed_state_notifier.dart b/lib/src/features/explore/data/notifiers/genre_feed/genre_feed_state_notifier.dart similarity index 92% rename from lib/src/features/explore/notifiers/genre_feed/genre_feed_state_notifier.dart rename to lib/src/features/explore/data/notifiers/genre_feed/genre_feed_state_notifier.dart index 6e3ca0eb..183d5d18 100644 --- a/lib/src/features/explore/notifiers/genre_feed/genre_feed_state_notifier.dart +++ b/lib/src/features/explore/data/notifiers/genre_feed/genre_feed_state_notifier.dart @@ -1,8 +1,8 @@ -import 'package:flutter_ebook_app/src/features/common/data/models/category_feed.dart'; -import 'package:flutter_ebook_app/src/features/explore/repositories/explore_repository.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; +import 'package:flutter_ebook_app/src/features/features.dart'; + part 'genre_feed_state.dart'; part 'genre_feed_state_notifier.freezed.dart'; diff --git a/lib/src/features/explore/notifiers/genre_feed/genre_feed_state_notifier.freezed.dart b/lib/src/features/explore/data/notifiers/genre_feed/genre_feed_state_notifier.freezed.dart similarity index 100% rename from lib/src/features/explore/notifiers/genre_feed/genre_feed_state_notifier.freezed.dart rename to lib/src/features/explore/data/notifiers/genre_feed/genre_feed_state_notifier.freezed.dart diff --git a/lib/src/features/explore/data/notifiers/notifiers.dart b/lib/src/features/explore/data/notifiers/notifiers.dart new file mode 100644 index 00000000..a59cce46 --- /dev/null +++ b/lib/src/features/explore/data/notifiers/notifiers.dart @@ -0,0 +1 @@ +export 'genre_feed/genre_feed_state_notifier.dart'; diff --git a/lib/src/features/explore/repositories/explore_repository.dart b/lib/src/features/explore/data/repositories/explore_repository.dart similarity index 100% rename from lib/src/features/explore/repositories/explore_repository.dart rename to lib/src/features/explore/data/repositories/explore_repository.dart diff --git a/lib/src/features/explore/data/repositories/repositories.dart b/lib/src/features/explore/data/repositories/repositories.dart new file mode 100644 index 00000000..d14b93c2 --- /dev/null +++ b/lib/src/features/explore/data/repositories/repositories.dart @@ -0,0 +1 @@ +export 'explore_repository.dart'; diff --git a/lib/src/features/explore/explore.dart b/lib/src/features/explore/explore.dart new file mode 100644 index 00000000..7f26dbd7 --- /dev/null +++ b/lib/src/features/explore/explore.dart @@ -0,0 +1,2 @@ +export 'screens/screens.dart'; +export 'data/data.dart'; diff --git a/lib/src/features/explore/screens/explore_screen.dart b/lib/src/features/explore/screens/explore_screen.dart index 21eeba09..7b416382 100644 --- a/lib/src/features/explore/screens/explore_screen.dart +++ b/lib/src/features/explore/screens/explore_screen.dart @@ -1,15 +1,10 @@ +import 'package:auto_route/auto_route.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_ebook_app/src/features/common/widgets/error_widget.dart'; -import 'package:flutter_ebook_app/src/features/common/widgets/loading_widget.dart'; -import 'package:flutter_ebook_app/src/features/common/widgets/book_card.dart'; -import 'package:flutter_ebook_app/src/features/explore/notifiers/genre_feed/genre_feed_state_notifier.dart'; -import 'package:flutter_ebook_app/src/features/explore/screens/genre_screen.dart'; -import 'package:flutter_ebook_app/src/features/home/data/notifiers/home_feed_state_notifier.dart'; -import 'package:flutter_ebook_app/router.dart'; +import 'package:flutter_ebook_app/src/features/features.dart'; +import 'package:flutter_ebook_app/src/router/app_router.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:flutter_ebook_app/src/features/common/data/models/category_feed.dart'; - +@RoutePage() class ExploreScreen extends ConsumerStatefulWidget { const ExploreScreen({super.key}); @@ -91,9 +86,8 @@ class _SectionHeader extends StatelessWidget { ), GestureDetector( onTap: () { - MyRouter.pushPage( - context, - GenreScreen( + context.router.push( + GenreRoute( title: '${link.title}', url: link.href!, ), @@ -102,7 +96,7 @@ class _SectionHeader extends StatelessWidget { child: Text( 'See All', style: TextStyle( - color: Theme.of(context).colorScheme.secondary, + color: context.theme.colorScheme.secondary, fontWeight: FontWeight.w400, ), ), diff --git a/lib/src/features/explore/screens/genre_screen.dart b/lib/src/features/explore/screens/genre_screen.dart index c5976d5d..6b48cfeb 100644 --- a/lib/src/features/explore/screens/genre_screen.dart +++ b/lib/src/features/explore/screens/genre_screen.dart @@ -1,12 +1,12 @@ import 'dart:async'; +import 'package:auto_route/auto_route.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_ebook_app/src/features/common/widgets/loading_widget.dart'; -import 'package:flutter_ebook_app/src/features/common/data/models/category_feed.dart'; -import 'package:flutter_ebook_app/src/features/common/widgets/book_list_item.dart'; -import 'package:flutter_ebook_app/src/features/explore/notifiers/genre_feed/genre_feed_state_notifier.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_ebook_app/src/features/features.dart'; + +@RoutePage() class GenreScreen extends ConsumerStatefulWidget { final String title; final String url; diff --git a/lib/src/features/explore/screens/screens.dart b/lib/src/features/explore/screens/screens.dart new file mode 100644 index 00000000..6acc5d76 --- /dev/null +++ b/lib/src/features/explore/screens/screens.dart @@ -0,0 +1,2 @@ +export 'explore_screen.dart'; +export 'genre_screen.dart'; diff --git a/lib/src/features/favorites/favourites.dart b/lib/src/features/favorites/favourites.dart new file mode 100644 index 00000000..80f5a18c --- /dev/null +++ b/lib/src/features/favorites/favourites.dart @@ -0,0 +1 @@ +export 'screens/screens.dart'; diff --git a/lib/src/features/favorites/screens/favorites_screen.dart b/lib/src/features/favorites/screens/favorites_screen.dart index 539d3ce6..26525142 100644 --- a/lib/src/features/favorites/screens/favorites_screen.dart +++ b/lib/src/features/favorites/screens/favorites_screen.dart @@ -1,10 +1,9 @@ +import 'package:auto_route/auto_route.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_ebook_app/src/features/common/data/models/category_feed.dart'; -import 'package:flutter_ebook_app/src/features/common/data/notifiers/favorites/favorites_state_notifier.dart'; -import 'package:flutter_ebook_app/src/features/common/widgets/book_item.dart'; -import 'package:flutter_ebook_app/src/features/common/widgets/empty_view.dart'; +import 'package:flutter_ebook_app/src/features/features.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +@RoutePage() class FavoritesScreen extends ConsumerStatefulWidget { const FavoritesScreen({super.key}); diff --git a/lib/src/features/favorites/screens/screens.dart b/lib/src/features/favorites/screens/screens.dart new file mode 100644 index 00000000..e69f6396 --- /dev/null +++ b/lib/src/features/favorites/screens/screens.dart @@ -0,0 +1 @@ +export 'favorites_screen.dart'; diff --git a/lib/src/features/features.dart b/lib/src/features/features.dart new file mode 100644 index 00000000..4b77b839 --- /dev/null +++ b/lib/src/features/features.dart @@ -0,0 +1,9 @@ +export 'splash/splash.dart'; +export 'tabs/tabs.dart'; +export 'settings/settings.dart'; +export 'explore/explore.dart'; +export 'home/home.dart'; +export 'favorites/favourites.dart'; +export 'downloads/downloads.dart'; +export 'book_details/book_details.dart'; +export 'common/common.dart'; diff --git a/lib/src/features/home/data/data.dart b/lib/src/features/home/data/data.dart new file mode 100644 index 00000000..a67d21bf --- /dev/null +++ b/lib/src/features/home/data/data.dart @@ -0,0 +1,2 @@ +export 'notifiers/notifiers.dart'; +export 'repositories/repositories.dart'; diff --git a/lib/src/features/home/data/notifiers/notifiers.dart b/lib/src/features/home/data/notifiers/notifiers.dart new file mode 100644 index 00000000..89ceced7 --- /dev/null +++ b/lib/src/features/home/data/notifiers/notifiers.dart @@ -0,0 +1 @@ +export 'home_feed_state_notifier.dart'; diff --git a/lib/src/features/home/data/repositories/repositories.dart b/lib/src/features/home/data/repositories/repositories.dart new file mode 100644 index 00000000..9d2c53cc --- /dev/null +++ b/lib/src/features/home/data/repositories/repositories.dart @@ -0,0 +1 @@ +export 'home_repository.dart'; diff --git a/lib/src/features/home/home.dart b/lib/src/features/home/home.dart new file mode 100644 index 00000000..7f26dbd7 --- /dev/null +++ b/lib/src/features/home/home.dart @@ -0,0 +1,2 @@ +export 'screens/screens.dart'; +export 'data/data.dart'; diff --git a/lib/src/features/home/screens/home_screen.dart b/lib/src/features/home/screens/home_screen.dart index b66816a0..252d97bb 100644 --- a/lib/src/features/home/screens/home_screen.dart +++ b/lib/src/features/home/screens/home_screen.dart @@ -1,15 +1,10 @@ +import 'package:auto_route/auto_route.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_ebook_app/src/features/common/constants/strings.dart'; -import 'package:flutter_ebook_app/src/features/common/widgets/error_widget.dart'; -import 'package:flutter_ebook_app/src/features/common/widgets/loading_widget.dart'; -import 'package:flutter_ebook_app/src/features/common/data/models/category_feed.dart'; -import 'package:flutter_ebook_app/src/features/common/widgets/book_card.dart'; -import 'package:flutter_ebook_app/src/features/common/widgets/book_list_item.dart'; -import 'package:flutter_ebook_app/src/features/explore/screens/genre_screen.dart'; -import 'package:flutter_ebook_app/src/features/home/data/notifiers/home_feed_state_notifier.dart'; -import 'package:flutter_ebook_app/router.dart'; +import 'package:flutter_ebook_app/src/features/features.dart'; +import 'package:flutter_ebook_app/src/router/app_router.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +@RoutePage() class HomeScreen extends ConsumerStatefulWidget { const HomeScreen({Key? key}) : super(key: key); @@ -169,7 +164,7 @@ class _GenreSection extends StatelessWidget { ), child: Container( decoration: BoxDecoration( - color: Theme.of(context).colorScheme.secondary, + color: context.theme.colorScheme.secondary, borderRadius: const BorderRadius.all( Radius.circular(20.0), ), @@ -179,13 +174,10 @@ class _GenreSection extends StatelessWidget { Radius.circular(20.0), ), onTap: () { - MyRouter.pushPage( - context, - GenreScreen( - title: '${link.title}', - url: link.href!, - ), - ); + context.router.push(GenreRoute( + title: '${link.title}', + url: link.href!, + )); }, child: Center( child: Padding( diff --git a/lib/src/features/home/screens/screens.dart b/lib/src/features/home/screens/screens.dart new file mode 100644 index 00000000..80259f1b --- /dev/null +++ b/lib/src/features/home/screens/screens.dart @@ -0,0 +1 @@ +export 'home_screen.dart'; diff --git a/lib/src/features/settings/screens/screens.dart b/lib/src/features/settings/screens/screens.dart new file mode 100644 index 00000000..2213cb23 --- /dev/null +++ b/lib/src/features/settings/screens/screens.dart @@ -0,0 +1 @@ +export 'settings_screen.dart'; diff --git a/lib/src/features/settings/screens/settings_screen.dart b/lib/src/features/settings/screens/settings_screen.dart index fdf67c40..1c1857c0 100644 --- a/lib/src/features/settings/screens/settings_screen.dart +++ b/lib/src/features/settings/screens/settings_screen.dart @@ -1,11 +1,11 @@ +import 'package:auto_route/auto_route.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_ebook_app/src/features/common/data/notifiers/current_app_theme/current_app_theme_state_notifier.dart'; -import 'package:flutter_ebook_app/src/features/downloads/screens/download_screen.dart'; -import 'package:flutter_ebook_app/router.dart'; -import 'package:flutter_ebook_app/src/features/favorites/screens/favorites_screen.dart'; +import 'package:flutter_ebook_app/src/features/features.dart'; +import 'package:flutter_ebook_app/src/router/app_router.dart'; import 'package:flutter_icons/flutter_icons.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +@RoutePage() class SettingsScreen extends StatefulWidget { const SettingsScreen({Key? key}) : super(key: key); @@ -23,12 +23,12 @@ class _SettingsScreenState extends State { { 'icon': Feather.heart, 'title': 'Favorites', - 'function': () => _pushPage(const FavoritesScreen()), + 'function': () => _pushPage(const FavoritesRoute()), }, { 'icon': Feather.download, 'title': 'Downloads', - 'function': () => _pushPage(const DownloadsScreen()), + 'function': () => _pushPage(const DownloadsRoute()), }, { 'icon': Feather.moon, @@ -40,11 +40,11 @@ class _SettingsScreenState extends State { 'title': 'About', 'function': () => showAbout(), }, - { - 'icon': Feather.file_text, - 'title': 'Licenses', - 'function': () => _pushPageDialog(const LicensePage()), - }, + // { + // 'icon': Feather.file_text, + // 'title': 'Licenses', + // 'function': () => _pushPage(const LicensePage()), + // }, ]; } @@ -88,12 +88,8 @@ class _SettingsScreenState extends State { ); } - void _pushPage(Widget page) { - MyRouter.pushPage(context, page); - } - - void _pushPageDialog(Widget page) { - MyRouter.pushPageDialog(context, page); + void _pushPage(PageRouteInfo route) { + context.router.push(route); } Future showAbout() async { @@ -111,7 +107,7 @@ class _SettingsScreenState extends State { TextButton( style: TextButton.styleFrom( textStyle: TextStyle( - color: Theme.of(context).colorScheme.secondary, + color: context.theme.colorScheme.secondary, ), ), onPressed: () => Navigator.pop(context), diff --git a/lib/src/features/settings/settings.dart b/lib/src/features/settings/settings.dart new file mode 100644 index 00000000..80f5a18c --- /dev/null +++ b/lib/src/features/settings/settings.dart @@ -0,0 +1 @@ +export 'screens/screens.dart'; diff --git a/lib/src/features/splash/screens/screens.dart b/lib/src/features/splash/screens/screens.dart new file mode 100644 index 00000000..6c28074d --- /dev/null +++ b/lib/src/features/splash/screens/screens.dart @@ -0,0 +1 @@ +export 'splash_screen.dart'; diff --git a/lib/src/features/splash/screens/splash_screen.dart b/lib/src/features/splash/screens/splash_screen.dart index c3b38b0a..52aeb8a9 100644 --- a/lib/src/features/splash/screens/splash_screen.dart +++ b/lib/src/features/splash/screens/splash_screen.dart @@ -1,9 +1,10 @@ import 'dart:async'; +import 'package:auto_route/auto_route.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_ebook_app/src/features/tabs/screens/tabs_screen.dart'; -import 'package:flutter_ebook_app/router.dart'; +import 'package:flutter_ebook_app/src/router/app_router.dart'; +@RoutePage() class SplashScreen extends StatefulWidget { const SplashScreen({super.key}); @@ -21,7 +22,7 @@ class _SplashScreenState extends State { } void changeScreen() async { - MyRouter.pushPageReplacement(context, const TabsScreen()); + context.router.replace(const TabsRoute()); } @override diff --git a/lib/src/features/splash/splash.dart b/lib/src/features/splash/splash.dart new file mode 100644 index 00000000..80f5a18c --- /dev/null +++ b/lib/src/features/splash/splash.dart @@ -0,0 +1 @@ +export 'screens/screens.dart'; diff --git a/lib/src/features/tabs/data/data.dart b/lib/src/features/tabs/data/data.dart new file mode 100644 index 00000000..2a2a3eec --- /dev/null +++ b/lib/src/features/tabs/data/data.dart @@ -0,0 +1 @@ +export 'notifiers/notifiers.dart'; diff --git a/lib/src/features/tabs/data/notifiers/notifiers.dart b/lib/src/features/tabs/data/notifiers/notifiers.dart new file mode 100644 index 00000000..06200f19 --- /dev/null +++ b/lib/src/features/tabs/data/notifiers/notifiers.dart @@ -0,0 +1 @@ +export 'current_tab_notifier.dart'; diff --git a/lib/src/features/tabs/screens/screens.dart b/lib/src/features/tabs/screens/screens.dart new file mode 100644 index 00000000..2abd5f8e --- /dev/null +++ b/lib/src/features/tabs/screens/screens.dart @@ -0,0 +1 @@ +export 'tabs_screen.dart'; diff --git a/lib/src/features/tabs/screens/tabs_screen.dart b/lib/src/features/tabs/screens/tabs_screen.dart index 806b7c15..94f9c7c9 100644 --- a/lib/src/features/tabs/screens/tabs_screen.dart +++ b/lib/src/features/tabs/screens/tabs_screen.dart @@ -1,20 +1,16 @@ +import 'package:auto_route/auto_route.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_ebook_app/src/features/common/widgets/modal_dialogs/exit_modal_dialog.dart'; -import 'package:flutter_ebook_app/src/features/explore/screens/explore_screen.dart'; -import 'package:flutter_ebook_app/src/features/home/data/notifiers/home_feed_state_notifier.dart'; -import 'package:flutter_ebook_app/src/features/home/screens/home_screen.dart'; -import 'package:flutter_ebook_app/src/features/settings/screens/settings_screen.dart'; -import 'package:flutter_ebook_app/src/features/tabs/data/notifiers/current_tab_notifier.dart'; +import 'package:flutter_ebook_app/src/features/features.dart'; +import 'package:flutter_ebook_app/src/router/app_router.dart'; import 'package:flutter_icons/flutter_icons.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +@RoutePage() class TabsScreen extends ConsumerWidget { const TabsScreen({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { - final currentTab = ref.watch(currentTabNotifierProvider); - // watch providers so they dnt get disposed ref.watch(homeDataStateNotifierProvider); @@ -22,28 +18,23 @@ class TabsScreen extends ConsumerWidget { onWillPop: () async { return await ExitModalDialog.show(context: context) ?? false; }, - child: ValueListenableBuilder( - valueListenable: currentTab, - builder: (context, page, _) { + child: AutoTabsRouter( + routes: const [ + HomeRoute(), + ExploreRoute(), + SettingsRoute(), + ], + transitionBuilder: (context, child, animation) => FadeTransition( + opacity: animation, + child: child, + ), + builder: (context, child) { + final tabsRouter = AutoTabsRouter.of(context); return Scaffold( - body: AnimatedSwitcher( - duration: const Duration(milliseconds: 300), - child: () { - switch (page) { - case 0: - return const HomeScreen(); - case 1: - return const ExploreScreen(); - case 2: - return const SettingsScreen(); - default: - return const HomeScreen(); - } - }(), - ), + body: child, bottomNavigationBar: BottomNavigationBar( - backgroundColor: Theme.of(context).primaryColor, - selectedItemColor: Theme.of(context).colorScheme.secondary, + backgroundColor: context.theme.primaryColor, + selectedItemColor: context.theme.colorScheme.secondary, unselectedItemColor: Colors.grey[500], elevation: 20, type: BottomNavigationBarType.fixed, @@ -61,8 +52,8 @@ class TabsScreen extends ConsumerWidget { label: 'Settings', ), ], - onTap: currentTab.changePage, - currentIndex: page, + onTap: tabsRouter.setActiveIndex, + currentIndex: tabsRouter.activeIndex, ), ); }, diff --git a/lib/src/features/tabs/tabs.dart b/lib/src/features/tabs/tabs.dart new file mode 100644 index 00000000..7f26dbd7 --- /dev/null +++ b/lib/src/features/tabs/tabs.dart @@ -0,0 +1,2 @@ +export 'screens/screens.dart'; +export 'data/data.dart'; diff --git a/lib/src/router/app_router.dart b/lib/src/router/app_router.dart new file mode 100644 index 00000000..69e5a524 --- /dev/null +++ b/lib/src/router/app_router.dart @@ -0,0 +1,56 @@ +import 'package:auto_route/auto_route.dart'; +import 'package:flutter_ebook_app/src/features/features.dart'; +import 'package:flutter/material.dart'; + +part 'app_router.gr.dart'; + +@AutoRouterConfig(replaceInRouteName: 'Screen,Route') +class AppRouter extends _$AppRouter { + @override + List get routes { + return [ + AutoRoute( + page: SplashRoute.page, + path: '/', + ), + CupertinoRoute( + page: TabsRoute.page, + path: '/tabs-screen', + children: [ + CupertinoRoute( + page: HomeRoute.page, + path: 'home-tab', + ), + CupertinoRoute( + page: ExploreRoute.page, + path: 'explore-tab', + ), + CupertinoRoute( + page: SettingsRoute.page, + path: 'settings-tab', + ), + ], + ), + CupertinoRoute( + page: BookDetailsRoute.page, + path: '/book-details-tab', + ), + CupertinoRoute( + page: ExploreRoute.page, + path: '/explore-tab', + ), + CupertinoRoute( + page: GenreRoute.page, + path: '/genre-tab', + ), + CupertinoRoute( + page: DownloadsRoute.page, + path: '/downloads-tab', + ), + CupertinoRoute( + page: FavoritesRoute.page, + path: '/favorites-tab', + ), + ]; + } +} diff --git a/lib/src/router/app_router.gr.dart b/lib/src/router/app_router.gr.dart new file mode 100644 index 00000000..677e0a99 --- /dev/null +++ b/lib/src/router/app_router.gr.dart @@ -0,0 +1,278 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +// ************************************************************************** +// AutoRouterGenerator +// ************************************************************************** + +// ignore_for_file: type=lint +// coverage:ignore-file + +part of 'app_router.dart'; + +abstract class _$AppRouter extends RootStackRouter { + // ignore: unused_element + _$AppRouter({super.navigatorKey}); + + @override + final Map pagesMap = { + TabsRoute.name: (routeData) { + return AutoRoutePage( + routeData: routeData, + child: const TabsScreen(), + ); + }, + SettingsRoute.name: (routeData) { + return AutoRoutePage( + routeData: routeData, + child: const SettingsScreen(), + ); + }, + HomeRoute.name: (routeData) { + return AutoRoutePage( + routeData: routeData, + child: const HomeScreen(), + ); + }, + SplashRoute.name: (routeData) { + return AutoRoutePage( + routeData: routeData, + child: const SplashScreen(), + ); + }, + FavoritesRoute.name: (routeData) { + return AutoRoutePage( + routeData: routeData, + child: const FavoritesScreen(), + ); + }, + GenreRoute.name: (routeData) { + final args = routeData.argsAs(); + return AutoRoutePage( + routeData: routeData, + child: GenreScreen( + key: args.key, + title: args.title, + url: args.url, + ), + ); + }, + ExploreRoute.name: (routeData) { + return AutoRoutePage( + routeData: routeData, + child: const ExploreScreen(), + ); + }, + BookDetailsRoute.name: (routeData) { + final args = routeData.argsAs(); + return AutoRoutePage( + routeData: routeData, + child: BookDetailsScreen( + key: args.key, + entry: args.entry, + imgTag: args.imgTag, + titleTag: args.titleTag, + authorTag: args.authorTag, + ), + ); + }, + DownloadsRoute.name: (routeData) { + return AutoRoutePage( + routeData: routeData, + child: const DownloadsScreen(), + ); + }, + }; +} + +/// generated route for +/// [TabsScreen] +class TabsRoute extends PageRouteInfo { + const TabsRoute({List? children}) + : super( + TabsRoute.name, + initialChildren: children, + ); + + static const String name = 'TabsRoute'; + + static const PageInfo page = PageInfo(name); +} + +/// generated route for +/// [SettingsScreen] +class SettingsRoute extends PageRouteInfo { + const SettingsRoute({List? children}) + : super( + SettingsRoute.name, + initialChildren: children, + ); + + static const String name = 'SettingsRoute'; + + static const PageInfo page = PageInfo(name); +} + +/// generated route for +/// [HomeScreen] +class HomeRoute extends PageRouteInfo { + const HomeRoute({List? children}) + : super( + HomeRoute.name, + initialChildren: children, + ); + + static const String name = 'HomeRoute'; + + static const PageInfo page = PageInfo(name); +} + +/// generated route for +/// [SplashScreen] +class SplashRoute extends PageRouteInfo { + const SplashRoute({List? children}) + : super( + SplashRoute.name, + initialChildren: children, + ); + + static const String name = 'SplashRoute'; + + static const PageInfo page = PageInfo(name); +} + +/// generated route for +/// [FavoritesScreen] +class FavoritesRoute extends PageRouteInfo { + const FavoritesRoute({List? children}) + : super( + FavoritesRoute.name, + initialChildren: children, + ); + + static const String name = 'FavoritesRoute'; + + static const PageInfo page = PageInfo(name); +} + +/// generated route for +/// [GenreScreen] +class GenreRoute extends PageRouteInfo { + GenreRoute({ + Key? key, + required String title, + required String url, + List? children, + }) : super( + GenreRoute.name, + args: GenreRouteArgs( + key: key, + title: title, + url: url, + ), + initialChildren: children, + ); + + static const String name = 'GenreRoute'; + + static const PageInfo page = PageInfo(name); +} + +class GenreRouteArgs { + const GenreRouteArgs({ + this.key, + required this.title, + required this.url, + }); + + final Key? key; + + final String title; + + final String url; + + @override + String toString() { + return 'GenreRouteArgs{key: $key, title: $title, url: $url}'; + } +} + +/// generated route for +/// [ExploreScreen] +class ExploreRoute extends PageRouteInfo { + const ExploreRoute({List? children}) + : super( + ExploreRoute.name, + initialChildren: children, + ); + + static const String name = 'ExploreRoute'; + + static const PageInfo page = PageInfo(name); +} + +/// generated route for +/// [BookDetailsScreen] +class BookDetailsRoute extends PageRouteInfo { + BookDetailsRoute({ + Key? key, + required Entry entry, + required String imgTag, + required String titleTag, + required String authorTag, + List? children, + }) : super( + BookDetailsRoute.name, + args: BookDetailsRouteArgs( + key: key, + entry: entry, + imgTag: imgTag, + titleTag: titleTag, + authorTag: authorTag, + ), + initialChildren: children, + ); + + static const String name = 'BookDetailsRoute'; + + static const PageInfo page = + PageInfo(name); +} + +class BookDetailsRouteArgs { + const BookDetailsRouteArgs({ + this.key, + required this.entry, + required this.imgTag, + required this.titleTag, + required this.authorTag, + }); + + final Key? key; + + final Entry entry; + + final String imgTag; + + final String titleTag; + + final String authorTag; + + @override + String toString() { + return 'BookDetailsRouteArgs{key: $key, entry: $entry, imgTag: $imgTag, titleTag: $titleTag, authorTag: $authorTag}'; + } +} + +/// generated route for +/// [DownloadsScreen] +class DownloadsRoute extends PageRouteInfo { + const DownloadsRoute({List? children}) + : super( + DownloadsRoute.name, + initialChildren: children, + ); + + static const String name = 'DownloadsRoute'; + + static const PageInfo page = PageInfo(name); +} diff --git a/lib/theme/theme_config.dart b/lib/src/theme/theme_config.dart similarity index 100% rename from lib/theme/theme_config.dart rename to lib/src/theme/theme_config.dart diff --git a/pubspec.lock b/pubspec.lock index 9ae4fd27..1646b69b 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -57,6 +57,22 @@ packages: url: "https://pub.dev" source: hosted version: "2.11.0" + auto_route: + dependency: "direct main" + description: + name: auto_route + sha256: "02120972925a567c37921fa28ac7e90680c7095dd0e70711353737ec2727cdc6" + url: "https://pub.dev" + source: hosted + version: "7.4.0" + auto_route_generator: + dependency: "direct dev" + description: + name: auto_route_generator + sha256: d0555913cc54153c38b1dd4f69e0d6a623818ca7195e7c1437901d52b2596eec + url: "https://pub.dev" + source: hosted + version: "7.1.1" bloc: dependency: transitive description: @@ -93,10 +109,10 @@ packages: dependency: transitive description: name: build_daemon - sha256: "757153e5d9cd88253cb13f28c2fb55a537dc31fefd98137549895b5beb7c6169" + sha256: "5f02d73eb2ba16483e693f80bee4f088563a820e47d1027d4cdfe62b5bb43e65" url: "https://pub.dev" source: hosted - version: "3.1.1" + version: "4.0.0" build_resolvers: dependency: transitive description: @@ -109,10 +125,10 @@ packages: dependency: "direct dev" description: name: build_runner - sha256: b0a8a7b8a76c493e85f1b84bffa0588859a06197863dba8c9036b15581fd9727 + sha256: "5e1929ad37d48bd382b124266cb8e521de5548d406a45a5ae6656c13dab73e37" url: "https://pub.dev" source: hosted - version: "2.3.3" + version: "2.4.5" build_runner_core: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index eff0ceda..fa3c374b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -7,6 +7,7 @@ environment: sdk: ">=2.17.0 <3.0.0" dependencies: + auto_route: ^7.4.0 cached_network_image: ^3.2.3 cupertino_icons: ^1.0.3 dartz: ^0.10.1 @@ -33,11 +34,12 @@ dependency_overrides: collection: ^1.17.2 dev_dependencies: + auto_route_generator: ^7.1.1 + build_runner: ^2.4.5 flutter_test: sdk: flutter flutter_lints: ^1.0.4 freezed: ^2.3.4 - build_runner: ^2.0.3 dart_code_metrics: ^5.7.4 flutter: