diff --git a/lib/pages/home/home.dart b/lib/pages/home/home.dart index 1baa948..aeed46a 100644 --- a/lib/pages/home/home.dart +++ b/lib/pages/home/home.dart @@ -1,10 +1,11 @@ -import 'package:didvan/config/design_config.dart'; -import 'package:didvan/pages/home/widgets/categories_gird.dart'; -import 'package:didvan/pages/home/widgets/categories_list.dart'; -import 'package:didvan/pages/home/widgets/search_field.dart'; -import 'package:didvan/widgets/didvan/text.dart'; -import 'package:didvan/widgets/logos/didvan_vertical_logo.dart'; +import 'package:didvan/pages/home/news/news.dart'; +import 'package:didvan/pages/home/profile/profile.dart'; +import 'package:didvan/pages/home/radar/radar.dart'; +import 'package:didvan/pages/home/radar/radar_state.dart'; +import 'package:didvan/pages/home/statistics/statistics.dart'; +import 'package:didvan/pages/home/studio/studio..dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; class Home extends StatefulWidget { const Home({Key? key}) : super(key: key); @@ -13,86 +14,35 @@ class Home extends StatefulWidget { State createState() => _HomeState(); } -class _HomeState extends State { - final ScrollController _scrollController = ScrollController(); - - bool _isColapsed = false; - bool _isAnimating = false; +class _HomeState extends State with SingleTickerProviderStateMixin { + late final TabController _tabController; @override void initState() { - _scrollController.addListener(() async { - if (_isAnimating) return; - final double position = _scrollController.position.pixels; - if (position > 5 && !_isColapsed) { - _isColapsed = true; - setState(() {}); - _isAnimating = true; - await _scrollController.animateTo( - 380, - duration: DesignConfig.defaultAnimationDuration, - curve: Curves.ease, - ); - _isAnimating = false; - } else if (position < 380 && _isColapsed) { - _isColapsed = false; - setState(() {}); - _isAnimating = true; - await _scrollController.animateTo( - 0, - duration: DesignConfig.defaultAnimationDuration, - curve: Curves.ease, - ); - _isAnimating = false; - } - }); + _tabController = TabController(length: 5, vsync: this); + _tabController.addListener(() {}); super.initState(); } @override Widget build(BuildContext context) { - final d = MediaQuery.of(context); return Scaffold( - body: Stack( - children: [ - CustomScrollView( - controller: _scrollController, - physics: const BouncingScrollPhysics(), - slivers: [ - SliverPadding( - padding: const EdgeInsets.all( - 20, - ).copyWith(top: d.padding.top + 20), - sliver: SliverToBoxAdapter( - child: Container( - alignment: Alignment.centerRight, - height: 76, - child: const DidvanHorizontalLogo(), - ), - ), - ), - const SliverPadding( - padding: EdgeInsets.symmetric(horizontal: 16), - sliver: SliverToBoxAdapter( - child: SearchField(), - ), - ), - SliverPadding( - padding: const EdgeInsets.only(top: 300, right: 16, bottom: 20), - sliver: SliverToBoxAdapter( - child: DidvanText( - 'آخرین رصد', - style: Theme.of(context).textTheme.subtitle1, - color: DesignConfig.darkPrimaryColor2, - ), - ), - ), - ], - ), - CategoriesRow1(isColapsed: _isColapsed), - CategoriesRow2(isColapsed: _isColapsed), - CategoriesList(isColapsed: _isColapsed), - ], + body: DefaultTabController( + length: 5, + child: TabBarView( + physics: const BouncingScrollPhysics(), + controller: _tabController, + children: [ + const News(), + const Statictics(), + ChangeNotifierProvider( + create: (context) => RadarState(), + child: const Radar(), + ), + const Studio(), + const Profile(), + ], + ), ), ); } diff --git a/lib/pages/home/news/news.dart b/lib/pages/home/news/news.dart new file mode 100644 index 0000000..ac0e882 --- /dev/null +++ b/lib/pages/home/news/news.dart @@ -0,0 +1,10 @@ +import 'package:flutter/material.dart'; + +class News extends StatelessWidget { + const News({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container(); + } +} diff --git a/lib/pages/home/profile/profile.dart b/lib/pages/home/profile/profile.dart new file mode 100644 index 0000000..980fc84 --- /dev/null +++ b/lib/pages/home/profile/profile.dart @@ -0,0 +1,10 @@ +import 'package:flutter/material.dart'; + +class Profile extends StatelessWidget { + const Profile({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container(); + } +} diff --git a/lib/pages/home/radar/radar.dart b/lib/pages/home/radar/radar.dart new file mode 100644 index 0000000..161f03e --- /dev/null +++ b/lib/pages/home/radar/radar.dart @@ -0,0 +1,99 @@ +import 'package:didvan/config/design_config.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/search_field.dart'; +import 'package:didvan/widgets/didvan/text.dart'; +import 'package:didvan/widgets/logos/didvan_vertical_logo.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 { + if (_isAnimating) return; + final double position = _scrollController.position.pixels; + if (position > 5 && !_isColapsed) { + _isColapsed = true; + setState(() {}); + _isAnimating = true; + await _scrollController.animateTo( + 380, + duration: DesignConfig.defaultAnimationDuration, + curve: Curves.ease, + ); + _isAnimating = false; + } else if (position < 380 && _isColapsed) { + _isColapsed = false; + setState(() {}); + _isAnimating = true; + await _scrollController.animateTo( + 0, + duration: DesignConfig.defaultAnimationDuration, + curve: Curves.ease, + ); + _isAnimating = false; + } + }); + super.initState(); + } + + @override + Widget build(BuildContext context) { + final d = MediaQuery.of(context); + return Scaffold( + body: Stack( + children: [ + CustomScrollView( + controller: _scrollController, + physics: const BouncingScrollPhysics(), + slivers: [ + SliverPadding( + padding: const EdgeInsets.all( + 20, + ).copyWith(top: d.padding.top + 20), + sliver: SliverToBoxAdapter( + child: Container( + alignment: Alignment.centerRight, + height: 76, + child: const DidvanHorizontalLogo(), + ), + ), + ), + const SliverPadding( + padding: EdgeInsets.symmetric(horizontal: 16), + sliver: SliverToBoxAdapter( + child: SearchField(), + ), + ), + SliverPadding( + padding: const EdgeInsets.only(top: 300, right: 16, bottom: 20), + sliver: SliverToBoxAdapter( + child: DidvanText( + 'آخرین رصد', + style: Theme.of(context).textTheme.subtitle1, + color: DesignConfig.darkPrimaryColor2, + ), + ), + ), + ], + ), + CategoriesRow1(isColapsed: _isColapsed), + CategoriesRow2(isColapsed: _isColapsed), + CategoriesList(isColapsed: _isColapsed), + ], + ), + ); + } +} diff --git a/lib/pages/home/home_state.dart b/lib/pages/home/radar/radar_state.dart similarity index 95% rename from lib/pages/home/home_state.dart rename to lib/pages/home/radar/radar_state.dart index 95c5840..1b84299 100644 --- a/lib/pages/home/home_state.dart +++ b/lib/pages/home/radar/radar_state.dart @@ -2,7 +2,7 @@ import 'package:didvan/constants/assets.dart'; import 'package:didvan/models/radar_category.dart'; import 'package:didvan/providers/core_provider.dart'; -class HomeState extends CoreProvier { +class RadarState extends CoreProvier { final List categories = [ RadarCategory( id: 1, diff --git a/lib/pages/home/widgets/categories_gird.dart b/lib/pages/home/radar/widgets/categories_gird.dart similarity index 91% rename from lib/pages/home/widgets/categories_gird.dart rename to lib/pages/home/radar/widgets/categories_gird.dart index fe7ae1b..eca753b 100644 --- a/lib/pages/home/widgets/categories_gird.dart +++ b/lib/pages/home/radar/widgets/categories_gird.dart @@ -1,6 +1,6 @@ import 'package:didvan/config/design_config.dart'; -import 'package:didvan/pages/home/home_state.dart'; -import 'package:didvan/pages/home/widgets/category_item.dart'; +import 'package:didvan/pages/home/radar/radar_state.dart'; +import 'package:didvan/pages/home/radar/widgets/category_item.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -18,7 +18,7 @@ class CategoriesRow1 extends StatelessWidget { right: isColapsed ? d.size.width : 0, child: Row( children: context - .read() + .read() .categories .sublist(0, 3) .map( @@ -57,7 +57,7 @@ class CategoriesRow2 extends StatelessWidget { right: isColapsed ? 124 : 0, child: Row( children: context - .read() + .read() .categories .sublist(3, 6) .map( diff --git a/lib/pages/home/widgets/categories_list.dart b/lib/pages/home/radar/widgets/categories_list.dart similarity index 95% rename from lib/pages/home/widgets/categories_list.dart rename to lib/pages/home/radar/widgets/categories_list.dart index b57ddc3..9d6cb38 100644 --- a/lib/pages/home/widgets/categories_list.dart +++ b/lib/pages/home/radar/widgets/categories_list.dart @@ -1,6 +1,6 @@ import 'package:didvan/config/design_config.dart'; import 'package:didvan/models/radar_category.dart'; -import 'package:didvan/pages/home/home_state.dart'; +import 'package:didvan/pages/home/radar/radar_state.dart'; import 'package:didvan/widgets/animated_visibility.dart'; import 'package:didvan/widgets/didvan/text.dart'; import 'package:flutter/material.dart'; @@ -13,7 +13,7 @@ class CategoriesList extends StatelessWidget { @override Widget build(BuildContext context) { final MediaQueryData d = MediaQuery.of(context); - final HomeState state = context.read(); + final RadarState state = context.read(); final List categories = []; categories.addAll(state.categories.sublist(3, 6)); categories.addAll(state.categories.sublist(0, 3)); diff --git a/lib/pages/home/widgets/category_item.dart b/lib/pages/home/radar/widgets/category_item.dart similarity index 100% rename from lib/pages/home/widgets/category_item.dart rename to lib/pages/home/radar/widgets/category_item.dart diff --git a/lib/pages/home/widgets/search_field.dart b/lib/pages/home/radar/widgets/search_field.dart similarity index 100% rename from lib/pages/home/widgets/search_field.dart rename to lib/pages/home/radar/widgets/search_field.dart diff --git a/lib/pages/home/statistics/statistics.dart b/lib/pages/home/statistics/statistics.dart new file mode 100644 index 0000000..9544791 --- /dev/null +++ b/lib/pages/home/statistics/statistics.dart @@ -0,0 +1,10 @@ +import 'package:flutter/material.dart'; + +class Statictics extends StatelessWidget { + const Statictics({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container(); + } +} diff --git a/lib/pages/home/studio/studio..dart b/lib/pages/home/studio/studio..dart new file mode 100644 index 0000000..3b4a32e --- /dev/null +++ b/lib/pages/home/studio/studio..dart @@ -0,0 +1,10 @@ +import 'package:flutter/material.dart'; + +class Studio extends StatelessWidget { + const Studio({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container(); + } +} diff --git a/lib/routes/route_generator.dart b/lib/routes/route_generator.dart index 2b5479f..7ea510f 100644 --- a/lib/routes/route_generator.dart +++ b/lib/routes/route_generator.dart @@ -1,7 +1,8 @@ import 'package:didvan/pages/authentication/authentication.dart'; import 'package:didvan/pages/authentication/authentication_state.dart'; import 'package:didvan/pages/home/home.dart'; -import 'package:didvan/pages/home/home_state.dart'; +import 'package:didvan/pages/home/radar/radar.dart'; +import 'package:didvan/pages/home/radar/radar_state.dart'; import 'package:didvan/pages/splash/splash.dart'; import 'package:didvan/pages/splash/splash_state.dart'; import 'package:didvan/routes/routes.dart'; @@ -27,10 +28,7 @@ class RouteGenerator { ); case Routes.home: return _materialPageRouteGenerator( - ChangeNotifierProvider( - create: (context) => HomeState(), - child: const Home(), - ), + const Home(), ); default: return _errorRoute();