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 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 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 redrawMainView() async { setState(() {}); } }