import 'package:didvan/config/design_config.dart'; import 'package:didvan/config/theme_data.dart'; import 'package:didvan/pages/home/radar/widgets/categories_gird.dart'; import 'package:didvan/pages/home/radar/widgets/categories_list.dart'; import 'package:didvan/pages/home/radar/widgets/radar_item.dart'; import 'package:didvan/pages/home/radar/widgets/search_field.dart'; import 'package:didvan/pages/home/widgets/logo_app_bar.dart'; import 'package:didvan/widgets/didvan/text.dart'; import 'package:flutter/material.dart'; class Radar extends StatefulWidget { const Radar({Key? key}) : super(key: key); @override State createState() => _RadarState(); } class _RadarState extends State { final ScrollController _scrollController = ScrollController(); bool _isColapsed = false; bool _isAnimating = false; @override void initState() { _scrollController.addListener(() async { _handleAnimations(); }); super.initState(); } @override Widget build(BuildContext context) { return Scaffold( body: Stack( children: [ CustomScrollView( physics: _isAnimating ? const NeverScrollableScrollPhysics() : const ScrollPhysics(), controller: _scrollController, slivers: [ const SliverToBoxAdapter(child: LogoAppBar()), SliverPadding( padding: const EdgeInsets.only(left: 16, right: 16, bottom: 16), sliver: SliverToBoxAdapter( child: SearchField( title: 'رادار', onChanged: (value) {}, ), ), ), SliverPadding( padding: const EdgeInsets.only(top: 284, right: 16, bottom: 20), sliver: SliverToBoxAdapter( child: DidvanText( 'آخرین رصد', style: Theme.of(context).textTheme.subtitle1, color: Theme.of(context).colorScheme.title, ), ), ), SliverList( delegate: SliverChildBuilderDelegate( (context, index) => const Padding( padding: EdgeInsets.only(bottom: 20), child: RadarItem(), ), childCount: 10, ), ), ], ), CategoriesRow1(isColapsed: _isColapsed), CategoriesRow2(isColapsed: _isColapsed), CategoriesList(isColapsed: _isColapsed), ], ), ); } void _handleAnimations() async { if (_isAnimating) return; final double position = _scrollController.position.pixels; if (position > 5 && !_isColapsed) { _isColapsed = true; _isAnimating = true; setState(() {}); await _scrollController.animateTo( 380, duration: DesignConfig.mediumAnimationDuration, curve: Curves.ease, ); _isAnimating = false; setState(() {}); } else if (position < 380 && _isColapsed) { _isColapsed = false; _isAnimating = true; setState(() {}); await _scrollController.animateTo( 0, duration: DesignConfig.mediumAnimationDuration, curve: Curves.ease, ); _isAnimating = false; setState(() {}); } } }