import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart' hide BaseLogic, SearchWidget; import 'package:rasadyar_livestock/presentation/widgets/app_bar/i_app_bar.dart'; import 'package:rasadyar_livestock/presentation/widgets/search.dart'; import 'logic.dart'; class BasePage extends StatefulWidget { const BasePage({ super.key, this.routes, required this.widgets, this.routesWidget, this.floatingActionButtonLocation, this.floatingActionButton, this.onSearchChanged, this.hasBack = true, this.hasFilter = true, this.hasSearch = true, this.isBase = false, this.defaultSearch = true, this.onBackPressed, this.onFilterTap, this.onSearchTap, this.filteringWidget, this.title, this.padding, this.avoidBottomInset = true, }); final List? routes; final Widget? routesWidget; final bool defaultSearch; final List widgets; final FloatingActionButtonLocation? floatingActionButtonLocation; final Widget? floatingActionButton; final Widget? filteringWidget; final void Function(String?)? onSearchChanged; final bool hasBack; final bool hasFilter; final bool hasSearch; final bool isBase; final bool avoidBottomInset; final VoidCallback? onBackPressed; final GestureTapCallback? onFilterTap; final GestureTapCallback? onSearchTap; final String? title; final EdgeInsets? padding; @override State createState() => _BasePageState(); } class _BasePageState extends State { BaseLogic get controller => Get.find(); Worker? filterWorker; final bool _isBottomSheetOpen = false; @override void initState() { super.initState(); /* filterWorker = ever(controller.isFilterSelected, (bool isSelected) { if (!mounted) return; if (isSelected && widget.filteringWidget != null) { // بررسی اینکه آیا bottomSheet از قبل باز است یا نه if (_isBottomSheetOpen) { controller.isFilterSelected.value = false; return; } // بررسی اینکه آیا route فعلی current است یا نه if (ModalRoute.of(context)?.isCurrent != true) { controller.isFilterSelected.value = false; return; } _isBottomSheetOpen = true; Get.bottomSheet( widget.filteringWidget!, isScrollControlled: true, isDismissible: true, enableDrag: true, ).then((_) { // تنظیم مقدار به false بعد از بسته شدن bottomSheet if (mounted) { _isBottomSheetOpen = false; controller.isFilterSelected.value = false; } }); } });*/ } @override void dispose() { filterWorker?.dispose(); super.dispose(); } void _onFilterTap() { if (widget.hasFilter && widget.filteringWidget != null) { final currentRoute = ModalRoute.of(context); if (currentRoute?.isCurrent != true) { return; } Get.bottomSheet( widget.filteringWidget!, isScrollControlled: true, isDismissible: true, enableDrag: true, ); } } @override Widget build(BuildContext context) { return PopScope( canPop: false, onPopInvokedWithResult: (didPop, result) => widget.onBackPressed, child: Scaffold( backgroundColor: AppColor.bgLight, resizeToAvoidBottomInset: widget.avoidBottomInset, appBar: liveStockAppBar( title: widget.title, hasBack: widget.isBase ? false : widget.hasBack, onBackPressed: widget.onBackPressed, hasFilter: widget.hasFilter, hasSearch: widget.hasSearch, isBase: widget.isBase, onFilterTap: widget.hasFilter ? _onFilterTap : null, onSearchTap: widget.hasSearch ? () => controller.toggleSearch() : null, ), body: Padding( padding: widget.padding ?? const EdgeInsets.all(0.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ //widget.routesWidget != null ? widget.routesWidget! : buildPageRoute(widget.routes!), if (!widget.isBase && widget.hasSearch && widget.defaultSearch) ...{ SearchWidget(onSearchChanged: widget.onSearchChanged), }, ...widget.widgets, ], ), ), floatingActionButtonLocation: widget.floatingActionButtonLocation ?? FloatingActionButtonLocation.startFloat, floatingActionButton: widget.floatingActionButton, ), ); } }