D1APP-26 home (static)
This commit is contained in:
parent
5925e71beb
commit
0276f996cc
|
|
@ -1,10 +1,11 @@
|
||||||
import 'package:didvan/config/design_config.dart';
|
import 'package:didvan/pages/home/news/news.dart';
|
||||||
import 'package:didvan/pages/home/widgets/categories_gird.dart';
|
import 'package:didvan/pages/home/profile/profile.dart';
|
||||||
import 'package:didvan/pages/home/widgets/categories_list.dart';
|
import 'package:didvan/pages/home/radar/radar.dart';
|
||||||
import 'package:didvan/pages/home/widgets/search_field.dart';
|
import 'package:didvan/pages/home/radar/radar_state.dart';
|
||||||
import 'package:didvan/widgets/didvan/text.dart';
|
import 'package:didvan/pages/home/statistics/statistics.dart';
|
||||||
import 'package:didvan/widgets/logos/didvan_vertical_logo.dart';
|
import 'package:didvan/pages/home/studio/studio..dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
class Home extends StatefulWidget {
|
class Home extends StatefulWidget {
|
||||||
const Home({Key? key}) : super(key: key);
|
const Home({Key? key}) : super(key: key);
|
||||||
|
|
@ -13,86 +14,35 @@ class Home extends StatefulWidget {
|
||||||
State<Home> createState() => _HomeState();
|
State<Home> createState() => _HomeState();
|
||||||
}
|
}
|
||||||
|
|
||||||
class _HomeState extends State<Home> {
|
class _HomeState extends State<Home> with SingleTickerProviderStateMixin {
|
||||||
final ScrollController _scrollController = ScrollController();
|
late final TabController _tabController;
|
||||||
|
|
||||||
bool _isColapsed = false;
|
|
||||||
bool _isAnimating = false;
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
_scrollController.addListener(() async {
|
_tabController = TabController(length: 5, vsync: this);
|
||||||
if (_isAnimating) return;
|
_tabController.addListener(() {});
|
||||||
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();
|
super.initState();
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final d = MediaQuery.of(context);
|
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
body: Stack(
|
body: DefaultTabController(
|
||||||
children: [
|
length: 5,
|
||||||
CustomScrollView(
|
child: TabBarView(
|
||||||
controller: _scrollController,
|
|
||||||
physics: const BouncingScrollPhysics(),
|
physics: const BouncingScrollPhysics(),
|
||||||
slivers: [
|
controller: _tabController,
|
||||||
SliverPadding(
|
children: [
|
||||||
padding: const EdgeInsets.all(
|
const News(),
|
||||||
20,
|
const Statictics(),
|
||||||
).copyWith(top: d.padding.top + 20),
|
ChangeNotifierProvider<RadarState>(
|
||||||
sliver: SliverToBoxAdapter(
|
create: (context) => RadarState(),
|
||||||
child: Container(
|
child: const Radar(),
|
||||||
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,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
|
const Studio(),
|
||||||
|
const Profile(),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
CategoriesRow1(isColapsed: _isColapsed),
|
|
||||||
CategoriesRow2(isColapsed: _isColapsed),
|
|
||||||
CategoriesList(isColapsed: _isColapsed),
|
|
||||||
],
|
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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<Radar> createState() => _RadarState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _RadarState extends State<Radar> {
|
||||||
|
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),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -2,7 +2,7 @@ import 'package:didvan/constants/assets.dart';
|
||||||
import 'package:didvan/models/radar_category.dart';
|
import 'package:didvan/models/radar_category.dart';
|
||||||
import 'package:didvan/providers/core_provider.dart';
|
import 'package:didvan/providers/core_provider.dart';
|
||||||
|
|
||||||
class HomeState extends CoreProvier {
|
class RadarState extends CoreProvier {
|
||||||
final List<RadarCategory> categories = [
|
final List<RadarCategory> categories = [
|
||||||
RadarCategory(
|
RadarCategory(
|
||||||
id: 1,
|
id: 1,
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import 'package:didvan/config/design_config.dart';
|
import 'package:didvan/config/design_config.dart';
|
||||||
import 'package:didvan/pages/home/home_state.dart';
|
import 'package:didvan/pages/home/radar/radar_state.dart';
|
||||||
import 'package:didvan/pages/home/widgets/category_item.dart';
|
import 'package:didvan/pages/home/radar/widgets/category_item.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
|
|
@ -18,7 +18,7 @@ class CategoriesRow1 extends StatelessWidget {
|
||||||
right: isColapsed ? d.size.width : 0,
|
right: isColapsed ? d.size.width : 0,
|
||||||
child: Row(
|
child: Row(
|
||||||
children: context
|
children: context
|
||||||
.read<HomeState>()
|
.read<RadarState>()
|
||||||
.categories
|
.categories
|
||||||
.sublist(0, 3)
|
.sublist(0, 3)
|
||||||
.map(
|
.map(
|
||||||
|
|
@ -57,7 +57,7 @@ class CategoriesRow2 extends StatelessWidget {
|
||||||
right: isColapsed ? 124 : 0,
|
right: isColapsed ? 124 : 0,
|
||||||
child: Row(
|
child: Row(
|
||||||
children: context
|
children: context
|
||||||
.read<HomeState>()
|
.read<RadarState>()
|
||||||
.categories
|
.categories
|
||||||
.sublist(3, 6)
|
.sublist(3, 6)
|
||||||
.map(
|
.map(
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import 'package:didvan/config/design_config.dart';
|
import 'package:didvan/config/design_config.dart';
|
||||||
import 'package:didvan/models/radar_category.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/animated_visibility.dart';
|
||||||
import 'package:didvan/widgets/didvan/text.dart';
|
import 'package:didvan/widgets/didvan/text.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
@ -13,7 +13,7 @@ class CategoriesList extends StatelessWidget {
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final MediaQueryData d = MediaQuery.of(context);
|
final MediaQueryData d = MediaQuery.of(context);
|
||||||
final HomeState state = context.read<HomeState>();
|
final RadarState state = context.read<RadarState>();
|
||||||
final List<RadarCategory> categories = [];
|
final List<RadarCategory> categories = [];
|
||||||
categories.addAll(state.categories.sublist(3, 6));
|
categories.addAll(state.categories.sublist(3, 6));
|
||||||
categories.addAll(state.categories.sublist(0, 3));
|
categories.addAll(state.categories.sublist(0, 3));
|
||||||
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
import 'package:didvan/pages/authentication/authentication.dart';
|
import 'package:didvan/pages/authentication/authentication.dart';
|
||||||
import 'package:didvan/pages/authentication/authentication_state.dart';
|
import 'package:didvan/pages/authentication/authentication_state.dart';
|
||||||
import 'package:didvan/pages/home/home.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.dart';
|
||||||
import 'package:didvan/pages/splash/splash_state.dart';
|
import 'package:didvan/pages/splash/splash_state.dart';
|
||||||
import 'package:didvan/routes/routes.dart';
|
import 'package:didvan/routes/routes.dart';
|
||||||
|
|
@ -27,10 +28,7 @@ class RouteGenerator {
|
||||||
);
|
);
|
||||||
case Routes.home:
|
case Routes.home:
|
||||||
return _materialPageRouteGenerator(
|
return _materialPageRouteGenerator(
|
||||||
ChangeNotifierProvider<HomeState>(
|
const Home(),
|
||||||
create: (context) => HomeState(),
|
|
||||||
child: const Home(),
|
|
||||||
),
|
|
||||||
);
|
);
|
||||||
default:
|
default:
|
||||||
return _errorRoute();
|
return _errorRoute();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue