From b146957c691a5b9bd48a16c9b5bbaa8968760da6 Mon Sep 17 00:00:00 2001 From: Myzel394 <50424412+Myzel394@users.noreply.github.com> Date: Mon, 15 Aug 2022 21:01:01 +0200 Subject: [PATCH] improved code --- lib/models/timeline.dart | 13 +++--- lib/models/timeline_overlay.dart | 2 +- lib/widgets/memory_slide.dart | 9 ++-- lib/widgets/timeline_overlay.dart | 78 +++++++++++++++++++++++++++++++ lib/widgets/timeline_page.dart | 77 +++++++----------------------- lib/widgets/timeline_scroll.dart | 1 + 6 files changed, 107 insertions(+), 73 deletions(-) create mode 100644 lib/widgets/timeline_overlay.dart diff --git a/lib/models/timeline.dart b/lib/models/timeline.dart index ff91669..d9a0d25 100644 --- a/lib/models/timeline.dart +++ b/lib/models/timeline.dart @@ -56,12 +56,11 @@ class TimelineModel extends PropertyChangeNotifier { MemoryPack atIndex(final int index) => _timeline.values.elementAt(index); - MemoryPack get currentMemoryPack => atIndex(currentIndex); - bool get isAtLastMemory => - _memoryIndex == currentMemoryPack.memories.length - 1; - + MemoryPack get _currentMemoryPack => atIndex(currentIndex); + bool get _isAtLastMemory => + _memoryIndex == _currentMemoryPack.memories.length - 1; Memory get currentMemory => - currentMemoryPack.memories.elementAt(_memoryIndex); + _currentMemoryPack.memories.elementAt(_memoryIndex); void _removeEmptyDates() { _timeline.removeWhere((key, value) => value.memories.isEmpty); @@ -118,11 +117,11 @@ class TimelineModel extends PropertyChangeNotifier { } setCurrentIndex(currentIndex - 1); - setMemoryIndex(currentMemoryPack.memories.length - 1); + setMemoryIndex(_currentMemoryPack.memories.length - 1); } void nextMemory() { - if (isAtLastMemory) { + if (_isAtLastMemory) { nextTimeline(); } else { setMemoryIndex(memoryIndex + 1); diff --git a/lib/models/timeline_overlay.dart b/lib/models/timeline_overlay.dart index 0a1ba94..15a9082 100644 --- a/lib/models/timeline_overlay.dart +++ b/lib/models/timeline_overlay.dart @@ -7,7 +7,7 @@ enum TimelineState { completed, } -class TimelineOverlay extends PropertyChangeNotifier { +class TimelineOverlayModel extends PropertyChangeNotifier { bool _showOverlay = true; TimelineState _state = TimelineState.loading; diff --git a/lib/widgets/memory_slide.dart b/lib/widgets/memory_slide.dart index f6647c4..ee09da2 100644 --- a/lib/widgets/memory_slide.dart +++ b/lib/widgets/memory_slide.dart @@ -3,7 +3,6 @@ import 'package:provider/provider.dart'; import 'package:share_location/controllers/status_controller.dart'; import 'package:share_location/enums.dart'; import 'package:share_location/foreign_types/memory.dart'; -import 'package:share_location/models/memory_pack.dart'; import 'package:share_location/models/timeline.dart'; import 'package:share_location/models/timeline_overlay.dart'; import 'package:share_location/widgets/status.dart'; @@ -31,13 +30,11 @@ class _MemorySlideState extends State Duration? duration; - MemoryPack getMemoryPack() => context.read().currentMemoryPack; - @override void initState() { super.initState(); - final timelineOverlay = context.read(); + final timelineOverlay = context.read(); timelineOverlay.addListener(() { if (!mounted) { @@ -62,7 +59,7 @@ class _MemorySlideState extends State } void initializeAnimation(final Duration newDuration) { - final timelineOverlay = context.read(); + final timelineOverlay = context.read(); duration = newDuration; @@ -88,7 +85,7 @@ class _MemorySlideState extends State @override Widget build(BuildContext context) { - return Consumer( + return Consumer( builder: (_, timelineOverlay, __) => Consumer( builder: (___, timeline, ____) => Status( controller: controller, diff --git a/lib/widgets/timeline_overlay.dart b/lib/widgets/timeline_overlay.dart new file mode 100644 index 0000000..5fbd35d --- /dev/null +++ b/lib/widgets/timeline_overlay.dart @@ -0,0 +1,78 @@ +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:provider/provider.dart'; +import 'package:share_location/constants/spacing.dart'; +import 'package:share_location/models/timeline.dart'; +import 'package:share_location/models/timeline_overlay.dart'; + +class TimelineOverlay extends StatelessWidget { + final DateTime date; + final int memoryIndex; + final int memoriesAmount; + + const TimelineOverlay({ + Key? key, + required this.date, + required this.memoryIndex, + required this.memoriesAmount, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final timeline = context.watch(); + final overlayController = context.watch(); + + return Stack( + children: [ + Padding( + padding: const EdgeInsets.only( + top: LARGE_SPACE, + left: MEDIUM_SPACE, + right: MEDIUM_SPACE, + ), + child: AnimatedOpacity( + duration: const Duration(milliseconds: 500), + curve: Curves.linearToEaseOut, + opacity: overlayController.showOverlay ? 1.0 : 0.0, + child: Text( + DateFormat('dd. MMMM yyyy').format(date), + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.headline1, + ), + ), + ), + Positioned( + right: SMALL_SPACE, + bottom: SMALL_SPACE * 2, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: SMALL_SPACE), + child: AnimatedOpacity( + duration: const Duration(milliseconds: 500), + curve: Curves.linearToEaseOut, + opacity: overlayController.showOverlay ? 1.0 : 0.0, + child: Row( + children: [ + AnimatedOpacity( + opacity: timeline.currentMemory.isPublic ? 1.0 : 0.0, + duration: const Duration(milliseconds: 500), + curve: Curves.linearToEaseOut, + child: Icon( + Icons.public, + size: theme.textTheme.titleSmall!.fontSize, + ), + ), + const SizedBox(width: SMALL_SPACE), + Text( + '$memoryIndex/$memoriesAmount', + style: Theme.of(context).textTheme.titleSmall, + ) + ], + ), + ), + ), + ), + ], + ); + } +} diff --git a/lib/widgets/timeline_page.dart b/lib/widgets/timeline_page.dart index e04cb6f..895cca2 100644 --- a/lib/widgets/timeline_page.dart +++ b/lib/widgets/timeline_page.dart @@ -1,21 +1,22 @@ import 'dart:async'; import 'package:flutter/material.dart'; -import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; -import 'package:share_location/constants/spacing.dart'; import 'package:share_location/models/memory_pack.dart'; import 'package:share_location/models/timeline.dart'; import 'package:share_location/models/timeline_overlay.dart'; import 'package:share_location/widgets/memory_sheet.dart'; import 'package:share_location/widgets/memory_slide.dart'; +import 'package:share_location/widgets/timeline_overlay.dart'; class TimelinePage extends StatefulWidget { final DateTime date; + final MemoryPack memoryPack; const TimelinePage({ Key? key, required this.date, + required this.memoryPack, }) : super(key: key); @override @@ -23,13 +24,11 @@ class TimelinePage extends StatefulWidget { } class _TimelinePageState extends State { - final timelineOverlayController = TimelineOverlay(); + final timelineOverlayController = TimelineOverlayModel(); final pageController = PageController(); Timer? overlayRemover; - MemoryPack getMemoryPack() => context.read().currentMemoryPack; - void _handleOverlayChangeBasedOnMemoryPack() { if (!mounted) { return; @@ -109,10 +108,10 @@ class _TimelinePageState extends State { @override Widget build(BuildContext context) { + final timeline = context.read(); + return GestureDetector( onDoubleTap: () async { - final timeline = context.read(); - timeline.pause(); await showModalBottomSheet( @@ -138,8 +137,6 @@ class _TimelinePageState extends State { timeline.resume(); }, onTapDown: (_) { - final timeline = context.read(); - timeline.pause(); overlayRemover = Timer( @@ -148,22 +145,16 @@ class _TimelinePageState extends State { ); }, onTapUp: (_) { - final timeline = context.read(); - overlayRemover?.cancel(); timeline.resume(); timelineOverlayController.restoreOverlay(); }, onTapCancel: () { - final timeline = context.read(); - overlayRemover?.cancel(); timeline.resume(); timelineOverlayController.restoreOverlay(); }, onHorizontalDragEnd: (details) { - final timeline = context.read(); - if (details.primaryVelocity! < 0) { timeline.nextMemory(); } else if (details.primaryVelocity! > 0) { @@ -175,52 +166,20 @@ class _TimelinePageState extends State { child: Stack( fit: StackFit.expand, children: [ - Consumer( - builder: (_, timeline, __) => PageView.builder( - controller: pageController, - physics: const NeverScrollableScrollPhysics(), - scrollDirection: Axis.horizontal, - itemBuilder: (_, index) => MemorySlide( - key: Key(timeline.currentMemoryPack.memories[index].filename), - memory: timeline.currentMemoryPack.memories[index], - ), - itemCount: timeline.currentMemoryPack.memories.length, + PageView.builder( + controller: pageController, + physics: const NeverScrollableScrollPhysics(), + scrollDirection: Axis.horizontal, + itemBuilder: (_, index) => MemorySlide( + key: Key(widget.memoryPack.memories[index].filename), + memory: widget.memoryPack.memories[index], ), + itemCount: widget.memoryPack.memories.length, ), - Padding( - padding: const EdgeInsets.only( - top: LARGE_SPACE, - left: MEDIUM_SPACE, - right: MEDIUM_SPACE, - ), - child: AnimatedOpacity( - duration: const Duration(milliseconds: 500), - curve: Curves.linearToEaseOut, - opacity: timelineOverlayController.showOverlay ? 1.0 : 0.0, - child: Text( - DateFormat('dd. MMMM yyyy').format(widget.date), - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.headline1, - ), - ), - ), - Positioned( - right: SMALL_SPACE, - bottom: SMALL_SPACE * 2, - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: SMALL_SPACE), - child: AnimatedOpacity( - duration: const Duration(milliseconds: 500), - curve: Curves.linearToEaseOut, - opacity: timelineOverlayController.showOverlay ? 1.0 : 0.0, - child: Consumer( - builder: (_, timeline, __) => Text( - '${timeline.memoryIndex + 1}/${timeline.currentMemoryPack.memories.length}', - style: Theme.of(context).textTheme.titleSmall, - ), - ), - ), - ), + TimelineOverlay( + date: widget.date, + memoriesAmount: widget.memoryPack.memories.length, + memoryIndex: timeline.memoryIndex, ), ], ), diff --git a/lib/widgets/timeline_scroll.dart b/lib/widgets/timeline_scroll.dart index 54f5e7d..0b950b7 100644 --- a/lib/widgets/timeline_scroll.dart +++ b/lib/widgets/timeline_scroll.dart @@ -75,6 +75,7 @@ class _TimelineScrollState extends State with Loadable { }, itemBuilder: (_, index) => TimelinePage( date: timeline.dateAtIndex(index), + memoryPack: timeline.atIndex(index), ), ), ),