diff --git a/lib/models/dns_statistics.dart b/lib/models/dns_statistics.dart index f279886..ca6c247 100644 --- a/lib/models/dns_statistics.dart +++ b/lib/models/dns_statistics.dart @@ -5,7 +5,7 @@ DnsStatistics dnsStatisticsFromJson(String str) => DnsStatistics.fromJson(json.d String dnsStatisticsToJson(DnsStatistics data) => json.encode(data.toJson()); class DnsStatistics { - final String timeUnits; + final String? timeUnits; final List> topQueriedDomains; final List> topClients; final List> topBlockedDomains; diff --git a/lib/providers/dns_provider.dart b/lib/providers/dns_provider.dart index 198053b..a59c3c5 100644 --- a/lib/providers/dns_provider.dart +++ b/lib/providers/dns_provider.dart @@ -151,20 +151,26 @@ class DnsProvider with ChangeNotifier { final result = await _serversProvider!.apiClient2!.setDnsConfig( data: value ); + + void updateValue(dynamic parameter, dynamic value) { + if (value != null) { + parameter = value; + } + } if (result.successful == true) { DnsInfo data = dnsInfo!; - data.ratelimit = value['ratelimit']; - data.ednsCsEnabled = value['edns_cs_enabled']; - data.dnssecEnabled = value['dnssec_enabled']; - data.disableIpv6 = value['disable_ipv6']; - data.blockingMode = value['blocking_mode']; - data.blockingIpv4 = value['blocking_ipv4']; - data.blockingIpv6 = value['blocking_ipv6']; - data.blockedResponseTtl = value['blocked_response_ttl']; - data.ratelimitSubnetLenIpv4 = value['ratelimit_subnet_len_ipv4']; - data.ratelimitSubnetLenIpv6 = value['ratelimit_subnet_len_ipv6']; - data.ratelimitWhitelist = value['ratelimit_whitelist']; + updateValue(data.ratelimit, value['ratelimit']); + updateValue(data.ednsCsEnabled, value['edns_cs_enabled']); + updateValue(data.dnssecEnabled, value['dnssec_enabled']); + updateValue(data.disableIpv6, value['disable_ipv6']); + updateValue(data.blockingMode, value['blocking_mode']); + updateValue(data.blockingIpv4, value['blocking_ipv4']); + updateValue(data.blockingIpv6, value['blocking_ipv6']); + updateValue(data.blockedResponseTtl, value['blocked_response_ttl']); + updateValue(data.ratelimitSubnetLenIpv4, value['ratelimit_subnet_len_ipv4']); + updateValue(data.ratelimitSubnetLenIpv6, value['ratelimit_subnet_len_ipv6']); + updateValue(data.ratelimitWhitelist, value['ratelimit_whitelist']); setDnsInfoData(data); return result; } diff --git a/lib/screens/filters/add_button.dart b/lib/screens/filters/add_button.dart index 2eca7d4..1621b68 100644 --- a/lib/screens/filters/add_button.dart +++ b/lib/screens/filters/add_button.dart @@ -137,6 +137,8 @@ class AddFiltersButton extends StatelessWidget { } void confirmAddList({required String name, required String url, required String type}) async { + if (!context.mounted) return; + ProcessModal processModal = ProcessModal(); processModal.open(AppLocalizations.of(context)!.addingList); diff --git a/lib/screens/filters/custom_rules_list.dart b/lib/screens/filters/custom_rules_list.dart index 304972f..4cd5bde 100644 --- a/lib/screens/filters/custom_rules_list.dart +++ b/lib/screens/filters/custom_rules_list.dart @@ -162,7 +162,7 @@ class _CustomRulesListState extends State { TextButton.icon( onPressed: () async { final result = await filteringProvider.fetchFilters(); - if (result == false) { + if (result == false && context.mounted) { showSnackbar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.errorLoadFilters, diff --git a/lib/screens/home/appbar.dart b/lib/screens/home/appbar.dart index 5cd481f..d4b447c 100644 --- a/lib/screens/home/appbar.dart +++ b/lib/screens/home/appbar.dart @@ -34,6 +34,7 @@ class HomeAppBar extends StatelessWidget { void navigateServers() { Future.delayed(const Duration(milliseconds: 0), (() { + if (!context.mounted) return; Navigator.of(context).push( MaterialPageRoute(builder: (context) => const Servers()) ); diff --git a/lib/screens/logs/filters/clients_modal.dart b/lib/screens/logs/filters/clients_modal.dart index 403f098..ef0e989 100644 --- a/lib/screens/logs/filters/clients_modal.dart +++ b/lib/screens/logs/filters/clients_modal.dart @@ -115,7 +115,7 @@ class _ClientsModalState extends State { void searchAddedClient(_ClientLog client) { final notIps = client.ids?.where((e) => isIpAddress(e) == false).toList(); - if (notIps == null) return; + if (notIps == null || notIps.isEmpty) return; logsProvider.setSearchText('"${notIps[0]}"'); Navigator.of(context).pop(); } diff --git a/lib/screens/logs/log_tile.dart b/lib/screens/logs/log_tile.dart index bed2e40..342817f 100644 --- a/lib/screens/logs/log_tile.dart +++ b/lib/screens/logs/log_tile.dart @@ -96,6 +96,8 @@ class LogTile extends StatelessWidget { } void blockUnblock({required String domain, required String newStatus}) async { + if (!context.mounted) return; + final ProcessModal processModal = ProcessModal(); processModal.open(AppLocalizations.of(context)!.savingUserFilters); @@ -124,6 +126,8 @@ class LogTile extends StatelessWidget { } void confirmAddClient(Client client) async { + if (!context.mounted) return; + ProcessModal processModal = ProcessModal(); processModal.open(AppLocalizations.of(context)!.addingClient); diff --git a/lib/screens/settings/statistics_settings/statistics_settings.dart b/lib/screens/settings/statistics_settings/statistics_settings.dart index 67a2989..7f58d67 100644 --- a/lib/screens/settings/statistics_settings/statistics_settings.dart +++ b/lib/screens/settings/statistics_settings/statistics_settings.dart @@ -138,7 +138,7 @@ class _StatisticsSettingsState extends State { "enabled": _generalSwitch, "interval": _retentionTime == "custom" ? Duration(hours: int.parse(_customTimeController.text)).inMilliseconds - : int.parse(_retentionTime!), + : int.parse(_retentionTime ?? _retentionItems[0]), "ignored": _ignoredDomainsControllers.map((e) => e.controller.text).toList() } );