Fixed duplicated snackbar desktop

This commit is contained in:
Juan Gilsanz Polo 2024-01-29 15:04:52 +01:00
parent a4e8694cc1
commit 02b9bd034f
3 changed files with 223 additions and 228 deletions

View file

@ -9,10 +9,12 @@ void showSnacbkar({
required AppConfigProvider appConfigProvider, required AppConfigProvider appConfigProvider,
required String label, required String label,
required Color color, required Color color,
Color? labelColor Color? labelColor,
GlobalKey<ScaffoldMessengerState>? key,
}) async { }) async {
final GlobalKey<ScaffoldMessengerState> scaffoldKey = key ?? scaffoldMessengerKey;
if (appConfigProvider.showingSnackbar == true) { if (appConfigProvider.showingSnackbar == true) {
scaffoldMessengerKey.currentState?.clearSnackBars(); scaffoldKey.currentState?.clearSnackBars();
await Future.delayed(const Duration(milliseconds: 500)); await Future.delayed(const Duration(milliseconds: 500));
} }
appConfigProvider.setShowingSnackbar(true); appConfigProvider.setShowingSnackbar(true);
@ -26,7 +28,7 @@ void showSnacbkar({
), ),
backgroundColor: color, backgroundColor: color,
); );
scaffoldMessengerKey.currentState?.showSnackBar(snackBar).closed.then( scaffoldKey.currentState?.showSnackBar(snackBar).closed.then(
(value) => appConfigProvider.setShowingSnackbar(false) (value) => appConfigProvider.setShowingSnackbar(false)
); );
} }

View file

@ -1,5 +1,6 @@
import 'dart:io'; import 'dart:io';
import 'package:adguard_home_manager/config/globals.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
@ -101,214 +102,217 @@ class _SettingsWidgetState extends State<_SettingsWidget> {
appConfigProvider.setSelectedSettingsScreen(screen: null); appConfigProvider.setSelectedSettingsScreen(screen: null);
} }
return Scaffold( return ScaffoldMessenger(
body: NestedScrollView( key: widget.twoColumns ? GlobalKey() : null,
headerSliverBuilder: (context, innerBoxIsScrolled) => [ child: Scaffold(
SliverOverlapAbsorber( body: NestedScrollView(
handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context), headerSliverBuilder: (context, innerBoxIsScrolled) => [
sliver: SliverAppBar.large( SliverOverlapAbsorber(
pinned: true, handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context),
floating: true, sliver: SliverAppBar.large(
centerTitle: false, pinned: true,
forceElevated: innerBoxIsScrolled, floating: true,
surfaceTintColor: isDesktop(width) ? Colors.transparent : null, centerTitle: false,
title: Text(AppLocalizations.of(context)!.settings), forceElevated: innerBoxIsScrolled,
surfaceTintColor: isDesktop(width) ? Colors.transparent : null,
title: Text(AppLocalizations.of(context)!.settings),
)
) )
) ],
], body: SafeArea(
body: SafeArea( top: false,
top: false, bottom: false,
bottom: false, child: Builder(
child: Builder( builder: (context) => CustomScrollView(
builder: (context) => CustomScrollView( slivers: [
slivers: [ SliverOverlapInjector(
SliverOverlapInjector( handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context),
handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context), ),
), SliverList.list(
SliverList.list( children: [
children: [ if (
if ( serversProvider.selectedServer != null &&
serversProvider.selectedServer != null && statusProvider.serverStatus != null &&
statusProvider.serverStatus != null && serversProvider.apiClient2 != null
serversProvider.apiClient2 != null ) ...[
) ...[ SectionLabel(label: AppLocalizations.of(context)!.serverSettings),
SectionLabel(label: AppLocalizations.of(context)!.serverSettings), _SettingsTile(
_SettingsTile( icon: Icons.search_rounded,
icon: Icons.search_rounded, title: AppLocalizations.of(context)!.safeSearch,
title: AppLocalizations.of(context)!.safeSearch, subtitle: AppLocalizations.of(context)!.safeSearchSettings,
subtitle: AppLocalizations.of(context)!.safeSearchSettings, thisItem: 0,
thisItem: 0, screenToNavigate: const SafeSearchSettingsScreen(),
screenToNavigate: const SafeSearchSettingsScreen(), twoColumns: widget.twoColumns,
twoColumns: widget.twoColumns,
),
_SettingsTile(
icon: Icons.list_alt_rounded,
title: AppLocalizations.of(context)!.logsSettings,
subtitle: AppLocalizations.of(context)!.logsSettingsDescription,
thisItem: 1,
screenToNavigate: const LogsSettings(),
twoColumns: widget.twoColumns,
),
_SettingsTile(
icon: Icons.analytics_rounded,
title: AppLocalizations.of(context)!.statisticsSettings,
subtitle: AppLocalizations.of(context)!.statisticsSettingsDescription,
thisItem: 2,
screenToNavigate: const StatisticsSettings(),
twoColumns: widget.twoColumns,
),
_SettingsTile(
icon: Icons.lock_rounded,
title: AppLocalizations.of(context)!.accessSettings,
subtitle: AppLocalizations.of(context)!.accessSettingsDescription,
thisItem: 3,
screenToNavigate: const AccessSettings(),
twoColumns: widget.twoColumns,
),
_SettingsTile(
icon: Icons.install_desktop_rounded,
title: AppLocalizations.of(context)!.dhcpSettings,
subtitle: AppLocalizations.of(context)!.dhcpSettingsDescription,
thisItem: 4,
screenToNavigate: const DhcpScreen(),
twoColumns: widget.twoColumns,
),
_SettingsTile(
icon: Icons.dns_rounded,
title: AppLocalizations.of(context)!.dnsSettings,
subtitle: AppLocalizations.of(context)!.dnsSettingsDescription,
thisItem: 5,
screenToNavigate: DnsSettings(
splitView: widget.twoColumns,
), ),
_SettingsTile(
icon: Icons.list_alt_rounded,
title: AppLocalizations.of(context)!.logsSettings,
subtitle: AppLocalizations.of(context)!.logsSettingsDescription,
thisItem: 1,
screenToNavigate: const LogsSettings(),
twoColumns: widget.twoColumns,
),
_SettingsTile(
icon: Icons.analytics_rounded,
title: AppLocalizations.of(context)!.statisticsSettings,
subtitle: AppLocalizations.of(context)!.statisticsSettingsDescription,
thisItem: 2,
screenToNavigate: const StatisticsSettings(),
twoColumns: widget.twoColumns,
),
_SettingsTile(
icon: Icons.lock_rounded,
title: AppLocalizations.of(context)!.accessSettings,
subtitle: AppLocalizations.of(context)!.accessSettingsDescription,
thisItem: 3,
screenToNavigate: const AccessSettings(),
twoColumns: widget.twoColumns,
),
_SettingsTile(
icon: Icons.install_desktop_rounded,
title: AppLocalizations.of(context)!.dhcpSettings,
subtitle: AppLocalizations.of(context)!.dhcpSettingsDescription,
thisItem: 4,
screenToNavigate: const DhcpScreen(),
twoColumns: widget.twoColumns,
),
_SettingsTile(
icon: Icons.dns_rounded,
title: AppLocalizations.of(context)!.dnsSettings,
subtitle: AppLocalizations.of(context)!.dnsSettingsDescription,
thisItem: 5,
screenToNavigate: DnsSettings(
splitView: widget.twoColumns,
),
twoColumns: widget.twoColumns,
),
_SettingsTile(
icon: Icons.security_rounded,
title: AppLocalizations.of(context)!.encryptionSettings,
subtitle: AppLocalizations.of(context)!.encryptionSettingsDescription,
thisItem: 6,
screenToNavigate: const EncryptionSettings(),
twoColumns: widget.twoColumns,
),
_SettingsTile(
icon: Icons.route_rounded,
title: AppLocalizations.of(context)!.dnsRewrites,
subtitle: AppLocalizations.of(context)!.dnsRewritesDescription,
thisItem: 7,
screenToNavigate: const DnsRewritesScreen(),
twoColumns: widget.twoColumns,
),
if (serversProvider.updateAvailable.data != null) _SettingsTile(
icon: Icons.system_update_rounded,
title: AppLocalizations.of(context)!.updates,
subtitle: AppLocalizations.of(context)!.updatesDescription,
trailing: serversProvider.updateAvailable.data != null &&
serversProvider.updateAvailable.data!.canAutoupdate == true
? Container(
width: 10,
height: 10,
margin: const EdgeInsets.only(right: 12),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(20),
color: Colors.red
),
)
: null,
thisItem: 8,
screenToNavigate: const UpdateScreen(),
twoColumns: widget.twoColumns,
),
_SettingsTile(
icon: Icons.info_rounded,
title: AppLocalizations.of(context)!.serverInformation,
subtitle: AppLocalizations.of(context)!.serverInformationDescription,
thisItem: 9,
screenToNavigate: const ServerInformation(),
twoColumns: widget.twoColumns,
),
],
SectionLabel(label: AppLocalizations.of(context)!.appSettings),
_SettingsTile(
icon: Icons.palette_rounded,
title: AppLocalizations.of(context)!.customization,
subtitle: AppLocalizations.of(context)!.customizationDescription,
thisItem: 10,
screenToNavigate: const Customization(),
twoColumns: widget.twoColumns, twoColumns: widget.twoColumns,
), ),
_SettingsTile( _SettingsTile(
icon: Icons.security_rounded, icon: Icons.storage_rounded,
title: AppLocalizations.of(context)!.encryptionSettings, title: AppLocalizations.of(context)!.servers,
subtitle: AppLocalizations.of(context)!.encryptionSettingsDescription, subtitle: serversProvider.selectedServer != null
thisItem: 6, ? statusProvider.serverStatus != null
screenToNavigate: const EncryptionSettings(), ? "${AppLocalizations.of(context)!.connectedTo} ${serversProvider.selectedServer!.name}"
: "${AppLocalizations.of(context)!.selectedServer} ${serversProvider.selectedServer!.name}"
: AppLocalizations.of(context)!.noServerSelected,
thisItem: 11,
screenToNavigate: const Servers(),
twoColumns: widget.twoColumns, twoColumns: widget.twoColumns,
), ),
_SettingsTile( _SettingsTile(
icon: Icons.route_rounded, icon: Icons.settings,
title: AppLocalizations.of(context)!.dnsRewrites, title: AppLocalizations.of(context)!.generalSettings,
subtitle: AppLocalizations.of(context)!.dnsRewritesDescription, subtitle: AppLocalizations.of(context)!.generalSettingsDescription,
thisItem: 7, thisItem: 12,
screenToNavigate: const DnsRewritesScreen(), screenToNavigate: GeneralSettings(splitView: widget.twoColumns),
twoColumns: widget.twoColumns,
),
if (serversProvider.updateAvailable.data != null) _SettingsTile(
icon: Icons.system_update_rounded,
title: AppLocalizations.of(context)!.updates,
subtitle: AppLocalizations.of(context)!.updatesDescription,
trailing: serversProvider.updateAvailable.data != null &&
serversProvider.updateAvailable.data!.canAutoupdate == true
? Container(
width: 10,
height: 10,
margin: const EdgeInsets.only(right: 12),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(20),
color: Colors.red
),
)
: null,
thisItem: 8,
screenToNavigate: const UpdateScreen(),
twoColumns: widget.twoColumns, twoColumns: widget.twoColumns,
), ),
_SettingsTile( _SettingsTile(
icon: Icons.info_rounded, icon: Icons.build_outlined,
title: AppLocalizations.of(context)!.serverInformation, title: AppLocalizations.of(context)!.advancedSettings,
subtitle: AppLocalizations.of(context)!.serverInformationDescription, subtitle: AppLocalizations.of(context)!.advancedSetupDescription,
thisItem: 9, thisItem: 13,
screenToNavigate: const ServerInformation(), screenToNavigate: const AdvancedSettings(),
twoColumns: widget.twoColumns, twoColumns: widget.twoColumns,
), ),
SectionLabel(label: AppLocalizations.of(context)!.aboutApp),
CustomListTile(
title: AppLocalizations.of(context)!.appVersion,
subtitle: appConfigProvider.getAppInfo!.version,
),
CustomListTile(
title: AppLocalizations.of(context)!.createdBy,
subtitle: Strings.createdBy,
),
Padding(
padding: const EdgeInsets.all(15),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
if (Platform.isAndroid) IconButton(
onPressed: () => openUrl(Urls.playStore),
icon: SvgPicture.asset(
'assets/resources/google-play.svg',
color: Theme.of(context).colorScheme.onSurfaceVariant,
width: 30,
height: 30,
),
tooltip: AppLocalizations.of(context)!.visitGooglePlay,
),
IconButton(
onPressed: () => openUrl(Urls.gitHub),
icon: SvgPicture.asset(
'assets/resources/github.svg',
color: Theme.of(context).colorScheme.onSurfaceVariant,
width: 30,
height: 30,
),
tooltip: AppLocalizations.of(context)!.gitHub,
),
],
),
)
], ],
SectionLabel(label: AppLocalizations.of(context)!.appSettings), )
_SettingsTile( ],
icon: Icons.palette_rounded, )
title: AppLocalizations.of(context)!.customization, ),
subtitle: AppLocalizations.of(context)!.customizationDescription,
thisItem: 10,
screenToNavigate: const Customization(),
twoColumns: widget.twoColumns,
),
_SettingsTile(
icon: Icons.storage_rounded,
title: AppLocalizations.of(context)!.servers,
subtitle: serversProvider.selectedServer != null
? statusProvider.serverStatus != null
? "${AppLocalizations.of(context)!.connectedTo} ${serversProvider.selectedServer!.name}"
: "${AppLocalizations.of(context)!.selectedServer} ${serversProvider.selectedServer!.name}"
: AppLocalizations.of(context)!.noServerSelected,
thisItem: 11,
screenToNavigate: const Servers(),
twoColumns: widget.twoColumns,
),
_SettingsTile(
icon: Icons.settings,
title: AppLocalizations.of(context)!.generalSettings,
subtitle: AppLocalizations.of(context)!.generalSettingsDescription,
thisItem: 12,
screenToNavigate: GeneralSettings(splitView: widget.twoColumns),
twoColumns: widget.twoColumns,
),
_SettingsTile(
icon: Icons.build_outlined,
title: AppLocalizations.of(context)!.advancedSettings,
subtitle: AppLocalizations.of(context)!.advancedSetupDescription,
thisItem: 13,
screenToNavigate: const AdvancedSettings(),
twoColumns: widget.twoColumns,
),
SectionLabel(label: AppLocalizations.of(context)!.aboutApp),
CustomListTile(
title: AppLocalizations.of(context)!.appVersion,
subtitle: appConfigProvider.getAppInfo!.version,
),
CustomListTile(
title: AppLocalizations.of(context)!.createdBy,
subtitle: Strings.createdBy,
),
Padding(
padding: const EdgeInsets.all(15),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
if (Platform.isAndroid) IconButton(
onPressed: () => openUrl(Urls.playStore),
icon: SvgPicture.asset(
'assets/resources/google-play.svg',
color: Theme.of(context).colorScheme.onSurfaceVariant,
width: 30,
height: 30,
),
tooltip: AppLocalizations.of(context)!.visitGooglePlay,
),
IconButton(
onPressed: () => openUrl(Urls.gitHub),
icon: SvgPicture.asset(
'assets/resources/github.svg',
color: Theme.of(context).colorScheme.onSurfaceVariant,
width: 30,
height: 30,
),
tooltip: AppLocalizations.of(context)!.gitHub,
),
],
),
)
],
)
],
)
), ),
), )
) ),
); );
} }
} }

View file

@ -4,38 +4,33 @@ PODS:
- dynamic_color (0.0.2): - dynamic_color (0.0.2):
- FlutterMacOS - FlutterMacOS
- FlutterMacOS (1.0.0) - FlutterMacOS (1.0.0)
- FMDB (2.7.5):
- FMDB/standard (= 2.7.5)
- FMDB/standard (2.7.5)
- package_info_plus (0.0.1): - package_info_plus (0.0.1):
- FlutterMacOS - FlutterMacOS
- Sentry/HybridSDK (8.17.2): - Sentry/HybridSDK (8.18.0):
- SentryPrivate (= 8.17.2) - SentryPrivate (= 8.18.0)
- sentry_flutter (0.0.1): - sentry_flutter (0.0.1):
- Flutter - Flutter
- FlutterMacOS - FlutterMacOS
- Sentry/HybridSDK (= 8.17.2) - Sentry/HybridSDK (= 8.18.0)
- SentryPrivate (8.17.2) - SentryPrivate (8.18.0)
- sqflite (0.0.2): - sqflite (0.0.3):
- Flutter
- FlutterMacOS - FlutterMacOS
- FMDB (>= 2.7.5) - sqlite3 (3.45.0):
- sqlite3 (3.44.0): - sqlite3/common (= 3.45.0)
- sqlite3/common (= 3.44.0) - sqlite3/common (3.45.0)
- sqlite3/common (3.44.0) - sqlite3/fts5 (3.45.0):
- sqlite3/fts5 (3.44.0):
- sqlite3/common - sqlite3/common
- sqlite3/perf-threadsafe (3.44.0): - sqlite3/perf-threadsafe (3.45.0):
- sqlite3/common - sqlite3/common
- sqlite3/rtree (3.44.0): - sqlite3/rtree (3.45.0):
- sqlite3/common - sqlite3/common
- sqlite3_flutter_libs (0.0.1): - sqlite3_flutter_libs (0.0.1):
- FlutterMacOS - FlutterMacOS
- sqlite3 (~> 3.44.0) - sqlite3 (~> 3.45.0)
- sqlite3/fts5 - sqlite3/fts5
- sqlite3/perf-threadsafe - sqlite3/perf-threadsafe
- sqlite3/rtree - sqlite3/rtree
- url_launcher_macos (0.0.1):
- FlutterMacOS
- window_size (0.0.2): - window_size (0.0.2):
- FlutterMacOS - FlutterMacOS
@ -45,14 +40,12 @@ DEPENDENCIES:
- FlutterMacOS (from `Flutter/ephemeral`) - FlutterMacOS (from `Flutter/ephemeral`)
- package_info_plus (from `Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos`) - package_info_plus (from `Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos`)
- sentry_flutter (from `Flutter/ephemeral/.symlinks/plugins/sentry_flutter/macos`) - sentry_flutter (from `Flutter/ephemeral/.symlinks/plugins/sentry_flutter/macos`)
- sqflite (from `Flutter/ephemeral/.symlinks/plugins/sqflite/macos`) - sqflite (from `Flutter/ephemeral/.symlinks/plugins/sqflite/darwin`)
- sqlite3_flutter_libs (from `Flutter/ephemeral/.symlinks/plugins/sqlite3_flutter_libs/macos`) - sqlite3_flutter_libs (from `Flutter/ephemeral/.symlinks/plugins/sqlite3_flutter_libs/macos`)
- url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`)
- window_size (from `Flutter/ephemeral/.symlinks/plugins/window_size/macos`) - window_size (from `Flutter/ephemeral/.symlinks/plugins/window_size/macos`)
SPEC REPOS: SPEC REPOS:
trunk: trunk:
- FMDB
- Sentry - Sentry
- SentryPrivate - SentryPrivate
- sqlite3 - sqlite3
@ -69,11 +62,9 @@ EXTERNAL SOURCES:
sentry_flutter: sentry_flutter:
:path: Flutter/ephemeral/.symlinks/plugins/sentry_flutter/macos :path: Flutter/ephemeral/.symlinks/plugins/sentry_flutter/macos
sqflite: sqflite:
:path: Flutter/ephemeral/.symlinks/plugins/sqflite/macos :path: Flutter/ephemeral/.symlinks/plugins/sqflite/darwin
sqlite3_flutter_libs: sqlite3_flutter_libs:
:path: Flutter/ephemeral/.symlinks/plugins/sqlite3_flutter_libs/macos :path: Flutter/ephemeral/.symlinks/plugins/sqlite3_flutter_libs/macos
url_launcher_macos:
:path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos
window_size: window_size:
:path: Flutter/ephemeral/.symlinks/plugins/window_size/macos :path: Flutter/ephemeral/.symlinks/plugins/window_size/macos
@ -81,15 +72,13 @@ SPEC CHECKSUMS:
device_info_plus: 5401765fde0b8d062a2f8eb65510fb17e77cf07f device_info_plus: 5401765fde0b8d062a2f8eb65510fb17e77cf07f
dynamic_color: 2eaa27267de1ca20d879fbd6e01259773fb1670f dynamic_color: 2eaa27267de1ca20d879fbd6e01259773fb1670f
FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24 FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24
FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
package_info_plus: 02d7a575e80f194102bef286361c6c326e4c29ce package_info_plus: 02d7a575e80f194102bef286361c6c326e4c29ce
Sentry: 64a9f9c3637af913adcf53deced05bbe452d1410 Sentry: 8984a4ffb2b9bd2894d74fb36e6f5833865bc18e
sentry_flutter: 57912cf425e09398bdf47f38842a1fcb9836f1be sentry_flutter: c87a0556eeb6cbf7f9f924d30e878bdedf22d364
SentryPrivate: 024c6fed507ac39ae98e6d087034160f942920d5 SentryPrivate: 2f0c9ba4c3fc993f70eab6ca95673509561e0085
sqflite: a5789cceda41d54d23f31d6de539d65bb14100ea sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec
sqlite3: 6e2d4a4879854d0ec86b476bf3c3e30870bac273 sqlite3: f307b6291c4db7b5086c38d6237446b98a738581
sqlite3_flutter_libs: a25f3a0f522fdcd8fef6a4a50a3d681dd43d8dea sqlite3_flutter_libs: 6b9913d8fbb718e5ebf23658aa6934a0fb509c0f
url_launcher_macos: d2691c7dd33ed713bf3544850a623080ec693d95
window_size: 339dafa0b27a95a62a843042038fa6c3c48de195 window_size: 339dafa0b27a95a62a843042038fa6c3c48de195
PODFILE CHECKSUM: 353c8bcc5d5b0994e508d035b5431cfe18c1dea7 PODFILE CHECKSUM: 353c8bcc5d5b0994e508d035b5431cfe18c1dea7