From 006c7982ddd57df00d1d8995f3fc18c8dc01039e Mon Sep 17 00:00:00 2001 From: MohammadTaha Basiri Date: Thu, 20 Jan 2022 18:09:15 +0330 Subject: [PATCH] component updates --- lib/widgets/bookmark_button.dart | 6 ++ lib/widgets/didvan/app_bar.dart | 1 + lib/widgets/didvan/page_view.dart | 110 +++++++++++++++++------ lib/widgets/didvan/switch.dart | 2 +- lib/widgets/floating_navigation_bar.dart | 69 ++++++++------ 5 files changed, 129 insertions(+), 59 deletions(-) diff --git a/lib/widgets/bookmark_button.dart b/lib/widgets/bookmark_button.dart index 6fae1b9..6ef9ca0 100644 --- a/lib/widgets/bookmark_button.dart +++ b/lib/widgets/bookmark_button.dart @@ -20,6 +20,12 @@ class BookmarkButton extends StatefulWidget { class _BookmarkButtonState extends State { bool _value = false; + @override + void didUpdateWidget(covariant BookmarkButton oldWidget) { + _value = widget.value; + super.didUpdateWidget(oldWidget); + } + @override void initState() { _value = widget.value; diff --git a/lib/widgets/didvan/app_bar.dart b/lib/widgets/didvan/app_bar.dart index be5fc38..569668e 100644 --- a/lib/widgets/didvan/app_bar.dart +++ b/lib/widgets/didvan/app_bar.dart @@ -24,6 +24,7 @@ class DidvanAppBar extends StatelessWidget { child: Align( alignment: Alignment.centerRight, child: Column( + crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.center, children: [ if (appBarData.title != null) diff --git a/lib/widgets/didvan/page_view.dart b/lib/widgets/didvan/page_view.dart index c455540..f16d70b 100644 --- a/lib/widgets/didvan/page_view.dart +++ b/lib/widgets/didvan/page_view.dart @@ -1,47 +1,99 @@ import 'package:carousel_slider/carousel_slider.dart'; import 'package:didvan/widgets/didvan/card.dart'; +import 'package:didvan/widgets/didvan/text.dart'; +import 'package:didvan/widgets/skeleton_image.dart'; import 'package:flutter/material.dart'; -class DidvanPageView extends StatelessWidget { - final List pages; +class DidvanPageView extends StatefulWidget { + final List items; + final int initialIndex; final ScrollController? scrollController; - final int initialPage; final void Function(int index) onPageChanged; const DidvanPageView({ Key? key, - required this.pages, + required this.initialIndex, + required this.items, this.scrollController, required this.onPageChanged, - this.initialPage = 2, }) : super(key: key); + @override + State createState() => _DidvanPageViewState(); +} + +class _DidvanPageViewState extends State { @override Widget build(BuildContext context) { final double deviceTopPadding = MediaQuery.of(context).padding.top; - return CarouselSlider.builder( - itemCount: pages.length, - options: CarouselOptions( - onPageChanged: (index, reason) => onPageChanged(index), - height: double.infinity, - initialPage: 2, - viewportFraction: 0.94, - enableInfiniteScroll: false, - ), - itemBuilder: (context, index, realIndex) => SizedBox( - height: MediaQuery.of(context).size.height, - child: SingleChildScrollView( - controller: index == 2 ? scrollController : null, - physics: const BouncingScrollPhysics(), - padding: EdgeInsets.only( - left: 4, - right: 4, - top: 16 + deviceTopPadding, - bottom: 92, - ), - child: DidvanCard( - padding: EdgeInsets.zero, - enableBorder: false, - child: pages[index], + return Directionality( + textDirection: TextDirection.ltr, + child: CarouselSlider.builder( + itemCount: widget.items.length, + options: CarouselOptions( + onPageChanged: (index, reason) => widget.onPageChanged(index), + height: double.infinity, + initialPage: widget.initialIndex, + viewportFraction: 0.94, + enableInfiniteScroll: false, + ), + itemBuilder: (context, index, realIndex) => SizedBox( + height: MediaQuery.of(context).size.height, + child: SingleChildScrollView( + controller: index == 1 ? widget.scrollController : null, + physics: const BouncingScrollPhysics(), + padding: EdgeInsets.only( + left: 4, + right: 4, + top: 16 + deviceTopPadding, + bottom: 92, + ), + child: DidvanCard( + padding: EdgeInsets.zero, + enableBorder: false, + child: Builder( + builder: (context) { + final item = widget.items[index]; + if (item == null) { + return const SizedBox(); + } + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SkeletonImage( + imageUrl: item.image, + aspectRatio: 16 / 9, + ), + const SizedBox(height: 20), + for (var i = 0; i < item.contents.length; i++) + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 4, + ), + child: Builder( + builder: (context) { + final content = item.contents[i]; + if (content.text != null) { + return DidvanText( + item.contents[i].text!, + ); + } + if (content.image != null) { + return SkeletonImage( + imageUrl: content.image!, + aspectRatio: 16 / 9, + ); + } + return const SizedBox(); + }, + ), + ), + const SizedBox(height: 20), + ], + ); + }, + ), + ), ), ), ), diff --git a/lib/widgets/didvan/switch.dart b/lib/widgets/didvan/switch.dart index d122ef4..ac353ed 100644 --- a/lib/widgets/didvan/switch.dart +++ b/lib/widgets/didvan/switch.dart @@ -1,4 +1,4 @@ -import 'package:didvan/pages/home/profile/widgets/menu_item.dart'; +import 'package:didvan/pages/home/settings/widgets/menu_item.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; diff --git a/lib/widgets/floating_navigation_bar.dart b/lib/widgets/floating_navigation_bar.dart index 4d8e7d4..9325abb 100644 --- a/lib/widgets/floating_navigation_bar.dart +++ b/lib/widgets/floating_navigation_bar.dart @@ -4,7 +4,7 @@ import 'package:didvan/constants/app_icons.dart'; import 'package:didvan/models/news_details_data.dart'; import 'package:didvan/models/radar_details_data.dart'; import 'package:didvan/models/view/action_sheet_data.dart'; -import 'package:didvan/pages/home/profile/widgets/menu_item.dart'; +import 'package:didvan/pages/home/settings/widgets/menu_item.dart'; import 'package:didvan/routes/routes.dart'; import 'package:didvan/utils/action_sheet.dart'; import 'package:didvan/widgets/bookmark_button.dart'; @@ -38,15 +38,25 @@ class _FloatingNavigationBarState extends State { get _item => widget.radar ?? widget.news; + @override + void didUpdateWidget(covariant FloatingNavigationBar oldWidget) { + if (widget.radar != null && oldWidget.radar!.id != widget.radar!.id || + widget.news != null && oldWidget.news!.id != widget.news!.id) { + _isScrolled = false; + } + super.didUpdateWidget(oldWidget); + } + @override void initState() { widget.scrollController.addListener(() { final position = widget.scrollController.position.pixels; - if (position > 300 && !_isScrolled) { + final offset = MediaQuery.of(context).size.width / 16 * 9 + 40; + if (position > offset && !_isScrolled) { setState(() { _isScrolled = true; }); - } else if (position < 300 && _isScrolled) { + } else if (position < offset && _isScrolled) { setState(() { _isScrolled = false; }); @@ -68,9 +78,11 @@ class _FloatingNavigationBarState extends State { decoration: BoxDecoration( color: Theme.of(context).colorScheme.navigation, borderRadius: BorderRadius.circular(24), - border: Border.all( - color: Theme.of(context).colorScheme.cardBorder, - ), + border: DesignConfig.isDark + ? Border.all( + color: Theme.of(context).colorScheme.cardBorder, + ) + : null, ), child: Theme( data: Theme.of(context).copyWith( @@ -80,21 +92,23 @@ class _FloatingNavigationBarState extends State { ), child: Row( children: [ - DidvanIconButton( - onPressed: () { - if (_isScrolled) { - widget.scrollController.animateTo( - 0, - duration: DesignConfig.lowAnimationDuration, - curve: Curves.easeIn, - ); - return; - } - Navigator.of(context).pop(); - }, - icon: _isScrolled - ? DidvanIcons.arrow_up_regular - : DidvanIcons.back_regular, + AnimatedRotation( + duration: DesignConfig.lowAnimationDuration, + turns: _isScrolled ? -0.25 : 0, + child: DidvanIconButton( + onPressed: () { + if (_isScrolled) { + widget.scrollController.animateTo( + 0, + duration: DesignConfig.lowAnimationDuration, + curve: Curves.easeIn, + ); + return; + } + Navigator.of(context).pop(); + }, + icon: DidvanIcons.back_regular, + ), ), const Spacer(), if (_isRadar) @@ -103,13 +117,6 @@ class _FloatingNavigationBarState extends State { onMark: widget.onMark, onUnmark: widget.onUnmark, ), - // if (_isRadar) - // IconButton( - // onPressed: () {}, - // icon: const Icon( - // DidvanIcons.evaluation_regular, - // ), - // ), SizedBox( width: 48, child: Row( @@ -125,7 +132,11 @@ class _FloatingNavigationBarState extends State { gestureSize: 32, onPressed: () => Navigator.of(context).pushNamed( Routes.comments, - arguments: {'id': _item.id, 'isRadar': _isRadar}, + arguments: { + 'id': _item.id, + 'isRadar': _isRadar, + 'title': _item.title + }, ), icon: DidvanIcons.chats_regular, ),