diff options
Diffstat (limited to 'lib/views/main_view.dart')
-rw-r--r-- | lib/views/main_view.dart | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/lib/views/main_view.dart b/lib/views/main_view.dart new file mode 100644 index 0000000..678db4a --- /dev/null +++ b/lib/views/main_view.dart @@ -0,0 +1,141 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +import 'package:kulinar_app/constants.dart'; +import 'package:kulinar_app/views/file_info.dart'; +import 'package:kulinar_app/views/recipe_view.dart'; +import 'package:kulinar_app/models/recipe_class.dart'; +import 'package:kulinar_app/widgets/error_widgets.dart'; +import 'package:kulinar_app/widgets/toastbar_widget.dart'; +import 'package:kulinar_app/widgets/recipe_card_widget.dart'; +import 'package:kulinar_app/widgets/custom_drawer_widget.dart'; +import 'package:kulinar_app/models/data/recipe_data_class.dart'; +import 'package:kulinar_app/widgets/recipe_search_delegate.dart'; +import 'package:kulinar_app/widgets/page_route_transitions.dart'; + +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; + +class MainView extends StatefulWidget { + const MainView({Key? key}) : super(key: key); + + @override + _MainViewState createState() => _MainViewState(); +} + +class _MainViewState extends State<MainView> with SingleTickerProviderStateMixin, WidgetsBindingObserver { + static const platform = const MethodChannel("com.davidpenkowoj.kulinar.openfile"); + + TabController? _tabController; + BuildContext? _toastyContext; + + @override + void initState() { + super.initState(); + getOpenFileUrl(); + WidgetsBinding.instance.addObserver(this); + _tabController = TabController(length: 2, vsync: this); + } + + @override + void dispose() { + super.dispose(); + _tabController!.dispose(); + WidgetsBinding.instance.removeObserver(this); + } + + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + if (state == AppLifecycleState.resumed) { + getOpenFileUrl(); + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: _buildAppBar(context, _tabController!), + drawer: CustomDrawer(initalIndex: 0), + floatingActionButton: _buildFloatingActionButton(), + body: Builder(builder: (BuildContext context) { + _toastyContext = context; + + return TabBarView( + controller: _tabController, + children: [ + _buildListView(RecipeData.recipeList.where((element) => element.rating > 0).toList()), + _buildListView(RecipeData.recipeList.where((element) => element.rating == 0).toList()), + ], + ); + }), + ); + } + + void getOpenFileUrl() async { + dynamic url = await platform.invokeMethod("getOpenFileUrl"); + + if (url != null) { + setState(() { + Navigator.pushAndRemoveUntil(context, MaterialPageRoute(builder: (BuildContext context) => FileInfo(filePath: url)), (_) => false); + }); + } + } + + void showToastCallback(String content, String actionLabel, Function actionCallback) { + ToastBar.showToastBar(_toastyContext!, content, actionLabel: actionLabel, actionCallback: actionCallback); + } + + Widget _buildFloatingActionButton() { + return FloatingActionButton( + child: Icon(Icons.add, color: cIconColor), + onPressed: () async { + await Navigator.push( + context, + SlideFromBottomRoute(child: RecipeView(readonly: false)), + ); + + setState(() {}); + }, + ); + } + + Widget _buildListView(List<Recipe> filteredRecipeList) { + if (filteredRecipeList.isEmpty) return NoContentError(); + + return ListView.builder( + itemCount: filteredRecipeList.length, + itemBuilder: (context, index) => RecipeCard(recipe: filteredRecipeList[index], redrawCallback: redrawMainView, showToastCallback: showToastCallback), + ); + } + + PreferredSizeWidget _buildAppBar(BuildContext context, TabController tabController) { + return AppBar( + title: Text(AppLocalizations.of(context)!.category1), + actions: [ + IconButton( + icon: Icon( + Icons.search, + ), + onPressed: () async { + await showSearch( + context: context, + delegate: RecipeSearch(), + ); + + setState(() {}); + }, + ), + ], + bottom: TabBar( + controller: tabController, + tabs: [ + Tab(child: Text(AppLocalizations.of(context)!.category2, style: cSubTitleStyle)), + Tab(child: Text(AppLocalizations.of(context)!.category3, style: cSubTitleStyle)), + ], + ), + ); + } + + Future<void> redrawMainView() async { + setState(() {}); + } +} |