From 9b34f385d566fde8ed12e1611240f982ba23e9b5 Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Tue, 21 Jan 2025 14:47:13 +0800 Subject: [PATCH] :bug: Fix app bar buttons clicking event got absorb by indicators --- lib/widgets/connection_indicator.dart | 80 ++++++++++++++------------- lib/widgets/notify_indicator.dart | 67 +++++++++++----------- 2 files changed, 78 insertions(+), 69 deletions(-) diff --git a/lib/widgets/connection_indicator.dart b/lib/widgets/connection_indicator.dart index db6d7d2..a45867a 100644 --- a/lib/widgets/connection_indicator.dart +++ b/lib/widgets/connection_indicator.dart @@ -18,45 +18,49 @@ class ConnectionIndicator extends StatelessWidget { listenable: ws, builder: (context, _) { final ua = context.read(); + final show = (ws.isBusy || !ws.isConnected) && ua.isAuthorized; - return GestureDetector( - child: Material( - elevation: 2, - shape: const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(16))), - color: Theme.of(context).colorScheme.secondaryContainer, - child: ua.isAuthorized - ? Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - if (ws.isBusy) - Text('serverConnecting').tr().textColor(Theme.of(context).colorScheme.onSecondaryContainer) - else if (!ws.isConnected) - Text('serverDisconnected').tr().textColor(Theme.of(context).colorScheme.onSecondaryContainer) - else - Text('serverConnected').tr().textColor(Theme.of(context).colorScheme.onSecondaryContainer), - const Gap(8), - if (ws.isBusy) - const CircularProgressIndicator(strokeWidth: 2.5) - .width(12) - .height(12) - .padding(horizontal: 4, right: 4) - else if (!ws.isConnected) - const Icon(Symbols.power_off, size: 18) - else - const Icon(Symbols.power, size: 18), - ], - ).padding(horizontal: 8, vertical: 4) - : const SizedBox.shrink(), - ).opacity((ws.isBusy || !ws.isConnected) && ua.isAuthorized ? 1 : 0, animate: true).animate( - const Duration(milliseconds: 300), - Curves.easeInOut, - ), - onTap: () { - if (!ws.isConnected && !ws.isBusy) { - ws.connect(); - } - }, + return IgnorePointer( + ignoring: !show, + child: GestureDetector( + child: Material( + elevation: 2, + shape: const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(16))), + color: Theme.of(context).colorScheme.secondaryContainer, + child: ua.isAuthorized + ? Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + if (ws.isBusy) + Text('serverConnecting').tr().textColor(Theme.of(context).colorScheme.onSecondaryContainer) + else if (!ws.isConnected) + Text('serverDisconnected').tr().textColor(Theme.of(context).colorScheme.onSecondaryContainer) + else + Text('serverConnected').tr().textColor(Theme.of(context).colorScheme.onSecondaryContainer), + const Gap(8), + if (ws.isBusy) + const CircularProgressIndicator(strokeWidth: 2.5) + .width(12) + .height(12) + .padding(horizontal: 4, right: 4) + else if (!ws.isConnected) + const Icon(Symbols.power_off, size: 18) + else + const Icon(Symbols.power, size: 18), + ], + ).padding(horizontal: 8, vertical: 4) + : const SizedBox.shrink(), + ).opacity(show ? 1 : 0, animate: true).animate( + const Duration(milliseconds: 300), + Curves.easeInOut, + ), + onTap: () { + if (!ws.isConnected && !ws.isBusy) { + ws.connect(); + } + }, + ), ); }, ); diff --git a/lib/widgets/notify_indicator.dart b/lib/widgets/notify_indicator.dart index cf40349..b1aae5d 100644 --- a/lib/widgets/notify_indicator.dart +++ b/lib/widgets/notify_indicator.dart @@ -15,43 +15,48 @@ class NotifyIndicator extends StatelessWidget { final ua = context.read(); final nty = context.watch(); + final show = nty.notifications.isNotEmpty && ua.isAuthorized; + return ListenableBuilder( listenable: nty, builder: (context, _) { - return GestureDetector( - child: Material( - elevation: 2, - shape: const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(16))), - color: Theme.of(context).colorScheme.secondaryContainer, - child: ua.isAuthorized - ? Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - nty.notifications.lastOrNull?.title ?? - 'notificationUnreadCount'.plural(nty.notifications.length), - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - if (nty.notifications.lastOrNull?.body != null) + return IgnorePointer( + ignoring: !show, + child: GestureDetector( + child: Material( + elevation: 2, + shape: const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(16))), + color: Theme.of(context).colorScheme.secondaryContainer, + child: ua.isAuthorized + ? Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ Text( - nty.notifications.lastOrNull!.body, + nty.notifications.lastOrNull?.title ?? + 'notificationUnreadCount'.plural(nty.notifications.length), maxLines: 1, overflow: TextOverflow.ellipsis, - ).padding(left: 4), - const Gap(8), - const Icon(Symbols.notifications_unread, size: 18), - ], - ).padding(horizontal: 8, vertical: 4) - : const SizedBox.shrink(), - ).opacity(nty.notifications.isNotEmpty && ua.isAuthorized ? 1 : 0, animate: true).animate( - const Duration(milliseconds: 300), - Curves.easeInOut, - ), - onTap: () { - nty.clear(); - }, + ), + if (nty.notifications.lastOrNull?.body != null) + Text( + nty.notifications.lastOrNull!.body, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ).padding(left: 4), + const Gap(8), + const Icon(Symbols.notifications_unread, size: 18), + ], + ).padding(horizontal: 8, vertical: 4) + : const SizedBox.shrink(), + ).opacity(show ? 1 : 0, animate: true).animate( + const Duration(milliseconds: 300), + Curves.easeInOut, + ), + onTap: () { + nty.clear(); + }, + ), ); }); }