From 8023a5f98673ac65af45fbc955fae276d1171740 Mon Sep 17 00:00:00 2001 From: Myzel394 <50424412+Myzel394@users.noreply.github.com> Date: Tue, 17 Oct 2023 11:06:32 +0200 Subject: [PATCH 1/2] fix: Make Timers sheet grow on height change --- lib/widgets/ModalSheetContent.dart | 4 +- lib/widgets/TimerWidget.dart | 3 + lib/widgets/TimerWidgetSheet.dart | 228 +++++++++++++++-------------- 3 files changed, 120 insertions(+), 115 deletions(-) diff --git a/lib/widgets/ModalSheetContent.dart b/lib/widgets/ModalSheetContent.dart index 9bb8be99..08525f57 100644 --- a/lib/widgets/ModalSheetContent.dart +++ b/lib/widgets/ModalSheetContent.dart @@ -1,10 +1,10 @@ import 'package:flutter/material.dart'; import 'package:flutter_platform_widgets/flutter_platform_widgets.dart'; +import 'package:locus/services/settings_service/index.dart'; import 'package:locus/utils/theme.dart'; import 'package:provider/provider.dart'; import '../constants/spacing.dart'; -import 'package:locus/services/settings_service/index.dart'; class ModalSheetContent extends StatelessWidget { final String title; @@ -61,7 +61,7 @@ class ModalSheetContent extends StatelessWidget { style: getCaptionTextStyle(context), ), ], - const SizedBox(height: LARGE_SPACE), + if (isMaterial(context)) const SizedBox(height: LARGE_SPACE), ...children, if (submitLabel != null) ...[ const SizedBox(height: LARGE_SPACE), diff --git a/lib/widgets/TimerWidget.dart b/lib/widgets/TimerWidget.dart index 97c3d470..be227823 100644 --- a/lib/widgets/TimerWidget.dart +++ b/lib/widgets/TimerWidget.dart @@ -65,12 +65,14 @@ class TimerController extends ChangeNotifier { class TimerWidget extends StatefulWidget { final TimerController? controller; + final ScrollController? scrollController; final List timers; final bool allowEdit; final ScrollPhysics? physics; const TimerWidget({ this.controller, + this.scrollController, this.timers = const [], this.allowEdit = true, this.physics, @@ -126,6 +128,7 @@ class _TimerWidgetState extends State { Widget build(BuildContext context) { return ListView.builder( shrinkWrap: true, + controller: widget.scrollController, physics: widget.physics, itemCount: _controller.timers.length, itemBuilder: (_, index) { diff --git a/lib/widgets/TimerWidgetSheet.dart b/lib/widgets/TimerWidgetSheet.dart index 2accbe4d..78396667 100644 --- a/lib/widgets/TimerWidgetSheet.dart +++ b/lib/widgets/TimerWidgetSheet.dart @@ -54,138 +54,140 @@ class _TimerWidgetSheetState extends State { return DraggableScrollableSheet( initialChildSize: 0.6, minChildSize: 0.6, - maxChildSize: 0.6, + maxChildSize: 1, expand: false, - builder: (_, __) => ModalSheet( - child: ModalSheetContent( - title: l10n.detailsTimersLabel, - submitLabel: l10n.closePositiveSheetAction, - onSubmit: (widget.controller.timers.isEmpty && !widget.allowEmpty) - ? null - : () { - Navigator.of(context).pop(widget.controller.timers); - }, - children: [ - if (widget.controller.timers.isNotEmpty) ...[ - Expanded( - child: TimerWidget( + builder: (context, controller) => ModalSheet( + child: SingleChildScrollView( + controller: controller, + child: ModalSheetContent( + title: l10n.detailsTimersLabel, + submitLabel: l10n.closePositiveSheetAction, + onSubmit: (widget.controller.timers.isEmpty && !widget.allowEmpty) + ? null + : () { + Navigator.of(context).pop(widget.controller.timers); + }, + children: [ + if (widget.controller.timers.isNotEmpty) ...[ + TimerWidget( controller: widget.controller, + physics: const NeverScrollableScrollPhysics(), ), - ), - const SizedBox(height: SMALL_SPACE), - if (findNextStartDate(widget.controller.timers) == null) - Text(l10n.timer_executionStartsImmediately) - else - Text(l10n.timer_nextExecution( - findNextStartDate(widget.controller.timers)!)), - if (widget.controller.timers - .any((timer) => timer.isInfinite())) ...[ const SizedBox(height: SMALL_SPACE), - WarningText(l10n.timer_runsInfiniteMessage), + if (findNextStartDate(widget.controller.timers) == null) + Text(l10n.timer_executionStartsImmediately) + else + Text(l10n.timer_nextExecution( + findNextStartDate(widget.controller.timers)!)), + if (widget.controller.timers + .any((timer) => timer.isInfinite())) ...[ + const SizedBox(height: SMALL_SPACE), + WarningText(l10n.timer_runsInfiniteMessage), + ], ], - ], - const SizedBox(height: MEDIUM_SPACE), - Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - PlatformPopup( - type: PlatformPopupType.longPress, - items: List>.from( - WEEKDAY_TIMERS.entries.map( - (entry) => PlatformPopupMenuItem( - label: Text(entry.value["name"] as String), - onPressed: () { - widget.controller.clear(); - - final timers = - entry.value["timers"] as List; - widget.controller.addAll(timers); - - Navigator.pop(context); - }, + const SizedBox(height: MEDIUM_SPACE), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + PlatformPopup( + type: PlatformPopupType.longPress, + items: List>.from( + WEEKDAY_TIMERS.entries.map( + (entry) => PlatformPopupMenuItem( + label: Text(entry.value["name"] as String), + onPressed: () { + widget.controller.clear(); + + final timers = + entry.value["timers"] as List; + widget.controller.addAll(timers); + + Navigator.pop(context); + }, + ), ), ), + child: PlatformTextButton( + child: Text(l10n.timer_addWeekday), + material: (_, __) => MaterialTextButtonData( + icon: const Icon(Icons.date_range_rounded), + ), + onPressed: () async { + final data = await showPlatformDialog( + context: context, + builder: (_) => const WeekdaySelection(), + ); + + if (!mounted) { + return; + } + + if (data != null) { + widget.controller.add( + WeekdayTimer( + day: data["weekday"] as int, + startTime: data["startTime"] as TimeOfDay, + endTime: data["endTime"] as TimeOfDay, + ), + ); + } + }, + ), ), - child: PlatformTextButton( - child: Text(l10n.timer_addWeekday), + PlatformTextButton( + child: Text(l10n.timer_addDuration), material: (_, __) => MaterialTextButtonData( - icon: const Icon(Icons.date_range_rounded), + icon: const Icon(Icons.timelapse_rounded), ), onPressed: () async { - final data = await showPlatformDialog( - context: context, - builder: (_) => const WeekdaySelection(), - ); - - if (!mounted) { - return; + Duration? duration; + + if (isCupertino(context)) { + await showCupertinoModalPopup( + context: context, + builder: (context) => Container( + height: 300, + padding: const EdgeInsets.only(top: 6.0), + margin: EdgeInsets.only( + bottom: MediaQuery.of(context).viewInsets.bottom, + ), + color: CupertinoColors.systemBackground + .resolveFrom(context), + child: SafeArea( + top: false, + child: CupertinoTimerPicker( + initialTimerDuration: Duration.zero, + minuteInterval: 5, + onTimerDurationChanged: (value) { + duration = value; + }, + mode: CupertinoTimerPickerMode.hm, + ), + ), + ), + ); + } else { + duration = await showDurationPicker( + context: context, + initialTime: Duration.zero, + snapToMins: 15.0, + ); } - if (data != null) { + if (duration != null && duration!.inSeconds > 0) { widget.controller.add( - WeekdayTimer( - day: data["weekday"] as int, - startTime: data["startTime"] as TimeOfDay, - endTime: data["endTime"] as TimeOfDay, + DurationTimer( + duration: duration!, ), ); } }, ), - ), - PlatformTextButton( - child: Text(l10n.timer_addDuration), - material: (_, __) => MaterialTextButtonData( - icon: const Icon(Icons.timelapse_rounded), - ), - onPressed: () async { - Duration? duration; - - if (isCupertino(context)) { - await showCupertinoModalPopup( - context: context, - builder: (context) => Container( - height: 300, - padding: const EdgeInsets.only(top: 6.0), - margin: EdgeInsets.only( - bottom: MediaQuery.of(context).viewInsets.bottom, - ), - color: CupertinoColors.systemBackground - .resolveFrom(context), - child: SafeArea( - top: false, - child: CupertinoTimerPicker( - initialTimerDuration: Duration.zero, - minuteInterval: 5, - onTimerDurationChanged: (value) { - duration = value; - }, - mode: CupertinoTimerPickerMode.hm, - ), - ), - ), - ); - } else { - duration = await showDurationPicker( - context: context, - initialTime: Duration.zero, - snapToMins: 15.0, - ); - } - - if (duration != null && duration!.inSeconds > 0) { - widget.controller.add( - DurationTimer( - duration: duration!, - ), - ); - } - }, - ), - ], - ), - ], + ], + ), + ], + ), ), ), ); From 41b8c4456b64fb4b6fb3cb4e2b6f36df36ca75c1 Mon Sep 17 00:00:00 2001 From: Myzel394 <50424412+Myzel394@users.noreply.github.com> Date: Wed, 18 Oct 2023 22:39:30 +0200 Subject: [PATCH 2/2] fix: Add Scaffold around CreateTaskScreen where required --- lib/screens/SharesOverviewScreen.dart | 13 ++-- .../screens/EmptyScreen.dart | 14 ++-- lib/widgets/TimerWidgetSheet.dart | 67 +++++++------------ pubspec.lock | 34 ++++++---- 4 files changed, 64 insertions(+), 64 deletions(-) diff --git a/lib/screens/SharesOverviewScreen.dart b/lib/screens/SharesOverviewScreen.dart index fa4fb5ac..0f3c76a6 100644 --- a/lib/screens/SharesOverviewScreen.dart +++ b/lib/screens/SharesOverviewScreen.dart @@ -59,10 +59,15 @@ class _SharesOverviewScreenState extends State { floatingActionButton: OpenContainer( transitionDuration: const Duration(milliseconds: 500), transitionType: ContainerTransitionType.fadeThrough, - openBuilder: (_, action) => CreateTaskScreen( - onCreated: () { - Navigator.pop(context); - }, + openBuilder: (_, action) => Scaffold( + appBar: AppBar( + title: Text(l10n.sharesOverviewScreen_createTask_action_create), + ), + body: CreateTaskScreen( + onCreated: () { + Navigator.pop(context); + }, + ), ), closedBuilder: (context, action) => InkWell( onTap: action, diff --git a/lib/screens/shares_overview_screen_widgets/screens/EmptyScreen.dart b/lib/screens/shares_overview_screen_widgets/screens/EmptyScreen.dart index 0c96ce50..be4561fe 100644 --- a/lib/screens/shares_overview_screen_widgets/screens/EmptyScreen.dart +++ b/lib/screens/shares_overview_screen_widgets/screens/EmptyScreen.dart @@ -79,10 +79,16 @@ class _EmptyScreenState extends State { OpenContainer( transitionDuration: const Duration(milliseconds: 700), transitionType: ContainerTransitionType.fade, - openBuilder: (context, action) => CreateTaskScreen( - onCreated: () { - Navigator.pop(context); - }, + openBuilder: (context, action) => PlatformScaffold( + appBar: PlatformAppBar( + title: Text( + l10n.sharesOverviewScreen_createTask_action_create), + ), + body: CreateTaskScreen( + onCreated: () { + Navigator.pop(context); + }, + ), ), closedShape: RoundedRectangleBorder( borderRadius: BorderRadius.all( diff --git a/lib/widgets/TimerWidgetSheet.dart b/lib/widgets/TimerWidgetSheet.dart index 78396667..c0c680ed 100644 --- a/lib/widgets/TimerWidgetSheet.dart +++ b/lib/widgets/TimerWidgetSheet.dart @@ -52,8 +52,8 @@ class _TimerWidgetSheetState extends State { final l10n = AppLocalizations.of(context); return DraggableScrollableSheet( - initialChildSize: 0.6, - minChildSize: 0.6, + initialChildSize: 0.5, + minChildSize: 0.5, maxChildSize: 1, expand: false, builder: (context, controller) => ModalSheet( @@ -90,50 +90,31 @@ class _TimerWidgetSheetState extends State { mainAxisAlignment: MainAxisAlignment.spaceEvenly, crossAxisAlignment: CrossAxisAlignment.center, children: [ - PlatformPopup( - type: PlatformPopupType.longPress, - items: List>.from( - WEEKDAY_TIMERS.entries.map( - (entry) => PlatformPopupMenuItem( - label: Text(entry.value["name"] as String), - onPressed: () { - widget.controller.clear(); - - final timers = - entry.value["timers"] as List; - widget.controller.addAll(timers); - - Navigator.pop(context); - }, - ), - ), + PlatformTextButton( + child: Text(l10n.timer_addWeekday), + material: (_, __) => MaterialTextButtonData( + icon: const Icon(Icons.date_range_rounded), ), - child: PlatformTextButton( - child: Text(l10n.timer_addWeekday), - material: (_, __) => MaterialTextButtonData( - icon: const Icon(Icons.date_range_rounded), - ), - onPressed: () async { - final data = await showPlatformDialog( - context: context, - builder: (_) => const WeekdaySelection(), - ); + onPressed: () async { + final data = await showPlatformDialog( + context: context, + builder: (_) => const WeekdaySelection(), + ); - if (!mounted) { - return; - } + if (!mounted) { + return; + } - if (data != null) { - widget.controller.add( - WeekdayTimer( - day: data["weekday"] as int, - startTime: data["startTime"] as TimeOfDay, - endTime: data["endTime"] as TimeOfDay, - ), - ); - } - }, - ), + if (data != null) { + widget.controller.add( + WeekdayTimer( + day: data["weekday"] as int, + startTime: data["startTime"] as TimeOfDay, + endTime: data["endTime"] as TimeOfDay, + ), + ); + } + }, ), PlatformTextButton( child: Text(l10n.timer_addDuration), diff --git a/pubspec.lock b/pubspec.lock index 16deb8f2..03837098 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -261,10 +261,10 @@ packages: dependency: "direct main" description: name: collection - sha256: "4a07be6cb69c84d677a6c3096fcf960cc3285a8330b4603e0d463d15d9bd934c" + sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687 url: "https://pub.dev" source: hosted - version: "1.17.1" + version: "1.17.2" convert: dependency: transitive description: @@ -825,10 +825,10 @@ packages: dependency: "direct main" description: name: intl - sha256: a3715e3bc90294e971cb7dc063fbf3cd9ee0ebf8604ffeafabd9e6f16abbdbe6 + sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d" url: "https://pub.dev" source: hosted - version: "0.18.0" + version: "0.18.1" io: dependency: transitive description: @@ -953,18 +953,18 @@ packages: dependency: transitive description: name: matcher - sha256: "6501fbd55da300384b768785b83e5ce66991266cec21af89ab9ae7f5ce1c4cbb" + sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" url: "https://pub.dev" source: hosted - version: "0.12.15" + version: "0.12.16" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 + sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" url: "https://pub.dev" source: hosted - version: "0.2.0" + version: "0.5.0" material_design_icons_flutter: dependency: "direct main" description: @@ -1366,10 +1366,10 @@ packages: dependency: transitive description: name: source_span - sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" url: "https://pub.dev" source: hosted - version: "1.9.1" + version: "1.10.0" stack_trace: dependency: transitive description: @@ -1414,10 +1414,10 @@ packages: dependency: transitive description: name: test_api - sha256: eb6ac1540b26de412b3403a163d919ba86f6a973fe6cc50ae3541b80092fdcfb + sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8" url: "https://pub.dev" source: hosted - version: "0.5.1" + version: "0.6.0" timezone: dependency: transitive description: @@ -1650,6 +1650,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.0" + web: + dependency: transitive + description: + name: web + sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10 + url: "https://pub.dev" + source: hosted + version: "0.1.4-beta" web_socket_channel: dependency: transitive description: @@ -1707,5 +1715,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=3.0.0 <4.0.0" + dart: ">=3.1.0-185.0.dev <4.0.0" flutter: ">=3.10.0"