From 645bbb9b53da11bff73d45f9bd1e76d84f8f4341 Mon Sep 17 00:00:00 2001 From: Fabian Freund Date: Mon, 16 Feb 2026 19:59:32 +0100 Subject: [PATCH] fix lints --- app/lib/domain/services/generic_website.dart | 29 +++++++---- .../domain/services/generic_website.g.dart | 2 +- .../about/presentation/screens/about.dart | 2 +- .../domain/services/home_widget.dart | 1 - .../bangs/presentation/screens/menu.dart | 2 +- .../bangs/presentation/screens/user.dart | 2 +- .../features/geckoview/domain/providers.dart | 28 ++++++---- .../geckoview/domain/providers.g.dart | 2 +- .../geckoview/domain/repositories/tab.dart | 20 +++---- .../geckoview/domain/repositories/tab.g.dart | 2 +- .../screens/bookmark_entry_edit.dart | 1 + .../screens/bookmark_folder_edit.dart | 6 ++- .../features/browser/domain/providers.dart | 2 +- .../features/browser/domain/providers.g.dart | 4 +- .../services/engine_settings_replication.dart | 6 --- .../services/proxy_settings_replication.dart | 1 - .../dialogs/open_shared_content.dart | 2 +- .../presentation/screens/tab_view.dart | 2 +- .../browser_modules/bottom_app_bar.dart | 10 ++-- .../widgets/browser_modules/browser_view.dart | 2 +- .../widgets/certificate_tile.dart | 2 +- .../presentation/widgets/error_container.dart | 2 +- .../widgets/extension_badge_icon.dart | 2 +- .../presentation/widgets/sheets/view_tab.dart | 2 +- .../widgets/tab_view/tab_view_header.dart | 26 ++++++++-- .../repositories/preference_observer.dart | 4 +- .../repositories/preference_observer.g.dart | 8 +-- .../search/presentation/screens/search.dart | 2 +- .../widgets/search_modules/feed_search.dart | 2 +- .../widgets/search_modules/tab_search.dart | 4 +- .../features/tabs/domain/providers.dart | 2 +- .../features/tabs/domain/providers.g.dart | 4 +- .../tabs/domain/repositories/tab.dart | 4 +- .../tabs/domain/repositories/tab.g.dart | 2 +- .../controllers/container_topic.dart | 2 +- .../controllers/container_topic.g.dart | 2 +- .../presentation/screens/container_list.dart | 26 ++++++++-- .../screens/container_selection.dart | 2 +- .../widgets/color_picker_dialog.dart | 2 +- .../presentation/widgets/container_chips.dart | 2 +- .../dialogs/qr_scanner_dialog.dart | 2 + .../presentation/screens/doh_settings.dart | 2 +- .../screens/fingerprint_settings.dart | 2 +- .../presentation/screens/locale_settings.dart | 2 +- .../screens/web_engine_hardening.dart | 2 +- .../widgets/default_search_selector.dart | 2 +- .../presentation/widgets/sections.dart | 4 +- .../widgets/sync_details_table.dart | 2 +- .../tor/domain/services/tor_proxy.dart | 2 - .../controllers/start_tor_proxy.dart | 52 +++++++++---------- .../controllers/start_tor_proxy.g.dart | 18 +++---- .../presentation/screens/country_picker.dart | 23 ++++---- .../tor/presentation/screens/tor_proxy.dart | 20 ++++--- .../tor/presentation/widgets/tor_dialog.dart | 2 +- .../widgets/tor_notification.dart | 2 + .../presentation/dialogs/select_profile.dart | 2 +- .../presentation/screens/profile_backup.dart | 2 +- .../screens/profile_backup_list.dart | 2 +- .../presentation/screens/profile_edit.dart | 2 +- .../presentation/screens/profile_list.dart | 2 +- .../presentation/widgets/auth_gate.dart | 2 +- .../screens/feed_article_list.dart | 2 +- .../presentation/screens/feed_list.dart | 2 +- .../presentation/select_feed_dialog.dart | 2 +- .../widgets/authors_horizontal_list.dart | 2 +- .../widgets/tags_horizontal_list.dart | 2 +- .../widgets/qr_scanner_button.dart | 4 +- .../example/pubspec.yaml | 4 +- .../example/test/widget_test.dart | 3 +- packages/flutter_tor/example/pubspec.yaml | 2 +- packages/flutter_tor/lib/flutter_tor.dart | 9 ++-- packages/flutter_tor/lib/src/flutter_tor.dart | 6 +-- packages/locale_resolver/example/pubspec.yaml | 8 +-- .../example/lib/main.dart | 2 +- .../example/pubspec.yaml | 11 ++-- .../example/lib/main.dart | 4 +- .../example/pubspec.yaml | 8 +-- .../lib/speech_to_text_dialog.dart | 6 +-- 78 files changed, 244 insertions(+), 210 deletions(-) diff --git a/app/lib/domain/services/generic_website.dart b/app/lib/domain/services/generic_website.dart index 4a6ed56c..399a5e5b 100644 --- a/app/lib/domain/services/generic_website.dart +++ b/app/lib/domain/services/generic_website.dart @@ -37,7 +37,6 @@ import 'package:weblibre/extensions/http_encoding.dart'; import 'package:weblibre/features/geckoview/domain/entities/browser_icon.dart'; import 'package:weblibre/features/user/domain/repositories/cache.dart'; import 'package:weblibre/features/web_feed/utils/feed_finder.dart'; -import 'package:weblibre/presentation/controllers/website_title.dart'; import 'package:weblibre/utils/lru_cache.dart'; part 'generic_website.g.dart'; @@ -87,6 +86,8 @@ class GenericWebsiteService extends _$GenericWebsiteService { late CacheRepository _cacheRepository; //Local decoded icon cache late final LRUCache _browserIconCache; + //In-flight fetch deduplication + final _inFlightFetches = >>{}; GenericWebsiteService() : _iconsService = GeckoIconService(), @@ -344,6 +345,13 @@ class GenericWebsiteService extends _$GenericWebsiteService { ); } + Future> _deduplicatedFetchPageInfo(Uri url) { + return _inFlightFetches.putIfAbsent(url, () { + return fetchPageInfo(url: url, isImageRequest: true, proxyPort: null) + .whenComplete(() => _inFlightFetches.remove(url)); + }); + } + Future getUrlIcon(List urlList) async { for (final url in urlList) { final cachedIcon = await getCachedIcon(url); @@ -353,18 +361,17 @@ class GenericWebsiteService extends _$GenericWebsiteService { } if (ref.mounted) { - // ignore: only_use_keep_alive_inside_keep_alive - final result = await ref.read( - pageInfoProvider(url, isImageRequest: true).future, - ); + final result = await _deduplicatedFetchPageInfo(url); - if (result.favicon case final BrowserIcon favicon) { - //If it was a `isImageRequest` hit, we need to cache it at this point - if (!_browserIconCache.contains(url.origin)) { - _browserIconCache.set(url.origin, favicon); + if (result.isSuccess) { + if (result.value.favicon case final BrowserIcon favicon) { + //If it was a `isImageRequest` hit, we need to cache it at this point + if (!_browserIconCache.contains(url.origin)) { + _browserIconCache.set(url.origin, favicon); + } + + return favicon; } - - return favicon; } } } diff --git a/app/lib/domain/services/generic_website.g.dart b/app/lib/domain/services/generic_website.g.dart index 4e77b868..ef781b70 100644 --- a/app/lib/domain/services/generic_website.g.dart +++ b/app/lib/domain/services/generic_website.g.dart @@ -42,7 +42,7 @@ final class GenericWebsiteServiceProvider } String _$genericWebsiteServiceHash() => - r'80b0f7113368bdd6fbe43fc27d2ab7332fe4b692'; + r'437e1b11b6e63d38151354522deda755d9333c47'; abstract class _$GenericWebsiteService extends $Notifier { void build(); diff --git a/app/lib/features/about/presentation/screens/about.dart b/app/lib/features/about/presentation/screens/about.dart index ce8ff624..0ace8cc1 100644 --- a/app/lib/features/about/presentation/screens/about.dart +++ b/app/lib/features/about/presentation/screens/about.dart @@ -26,7 +26,7 @@ import 'package:weblibre/features/about/domain/providers.dart'; import 'package:weblibre/features/geckoview/domain/repositories/tab.dart'; class AboutDialogScreen extends HookConsumerWidget { - const AboutDialogScreen(); + const AboutDialogScreen({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { diff --git a/app/lib/features/app_widget/domain/services/home_widget.dart b/app/lib/features/app_widget/domain/services/home_widget.dart index 64607837..41cd999f 100644 --- a/app/lib/features/app_widget/domain/services/home_widget.dart +++ b/app/lib/features/app_widget/domain/services/home_widget.dart @@ -31,7 +31,6 @@ Future widgetPinnable(Ref ref) async { @Riverpod() Raw> appWidgetLaunchStream(Ref ref) { - // ignore: discarded_futures is used as stream final initialStream = HomeWidget.initiallyLaunchedFromHomeWidget().asStream(); return ConcatStream([ diff --git a/app/lib/features/bangs/presentation/screens/menu.dart b/app/lib/features/bangs/presentation/screens/menu.dart index c1154bd5..ff059449 100644 --- a/app/lib/features/bangs/presentation/screens/menu.dart +++ b/app/lib/features/bangs/presentation/screens/menu.dart @@ -23,7 +23,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:weblibre/core/routing/routes.dart'; class BangMenuScreen extends HookConsumerWidget { - const BangMenuScreen(); + const BangMenuScreen({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { diff --git a/app/lib/features/bangs/presentation/screens/user.dart b/app/lib/features/bangs/presentation/screens/user.dart index d60b2dd6..48faabff 100644 --- a/app/lib/features/bangs/presentation/screens/user.dart +++ b/app/lib/features/bangs/presentation/screens/user.dart @@ -33,7 +33,7 @@ import 'package:weblibre/presentation/widgets/failure_widget.dart'; class UserBangs extends HookConsumerWidget { static const _userGroupFilter = [BangGroup.user]; - const UserBangs(); + const UserBangs({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { diff --git a/app/lib/features/geckoview/domain/providers.dart b/app/lib/features/geckoview/domain/providers.dart index 313387bb..078fed9c 100644 --- a/app/lib/features/geckoview/domain/providers.dart +++ b/app/lib/features/geckoview/domain/providers.dart @@ -20,6 +20,7 @@ import 'dart:async'; import 'package:flutter_mozilla_components/flutter_mozilla_components.dart'; +import 'package:nullability/nullability.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:share_plus/share_plus.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -30,7 +31,7 @@ import 'package:weblibre/features/bangs/domain/providers/bangs.dart'; import 'package:weblibre/features/geckoview/domain/providers/selected_tab.dart'; import 'package:weblibre/features/geckoview/domain/providers/tab_state.dart'; import 'package:weblibre/features/geckoview/domain/repositories/tab.dart'; -import 'package:weblibre/features/geckoview/features/find_in_page/presentation/controllers/find_in_page.dart'; +import 'package:weblibre/features/geckoview/features/find_in_page/domain/repositories/find_in_page.dart'; import 'package:weblibre/features/user/domain/repositories/general_settings.dart'; part 'providers.g.dart'; @@ -46,11 +47,17 @@ GeckoSelectionActionService selectionActionService(Ref ref) { final router = await ref.read(routerProvider.future); if (ref.mounted) { final settings = ref.read(generalSettingsWithDefaultsProvider); + final selectedTabState = ref.read( + tabStatesProvider, + )[ref.read(selectedTabProvider)]; + + final isPrivate = selectedTabState?.isPrivate.mapNotNull( + (isCurrentPrivate) => + isCurrentPrivate ? TabType.private : TabType.regular, + ); + final route = SearchRoute( - tabType: - // ignore: only_use_keep_alive_inside_keep_alive - ref.read(selectedTabTypeProvider) ?? - settings.defaultCreateTabType, + tabType: isPrivate ?? settings.defaultCreateTabType, searchText: text, ); @@ -65,8 +72,10 @@ GeckoSelectionActionService selectionActionService(Ref ref) { ); if (ref.mounted && defaultSearchBang != null) { - // ignore: only_use_keep_alive_inside_keep_alive - final currentTab = ref.read(selectedTabStateProvider); + final currentTab = ref.read( + tabStatesProvider, + )[ref.read(selectedTabProvider)]; + final isPrivate = currentTab?.isPrivate ?? ref @@ -91,10 +100,9 @@ GeckoSelectionActionService selectionActionService(Ref ref) { if (ref.mounted) { final tabId = ref.read(selectedTabProvider); if (tabId != null) { - // ignore: only_use_keep_alive_inside_keep_alive await ref - .read(findInPageControllerProvider(tabId).notifier) - .findAll(text: text); + .read(findInPageRepositoryProvider(tabId).notifier) + .findAll(text); } } }), diff --git a/app/lib/features/geckoview/domain/providers.g.dart b/app/lib/features/geckoview/domain/providers.g.dart index 213a9021..2d842dea 100644 --- a/app/lib/features/geckoview/domain/providers.g.dart +++ b/app/lib/features/geckoview/domain/providers.g.dart @@ -55,7 +55,7 @@ final class SelectionActionServiceProvider } String _$selectionActionServiceHash() => - r'6250d2121375b2a41c2f0450512fc836c996f461'; + r'75fa0fa770e74e49554d4098102fde9f9e531c4f'; @ProviderFor(eventService) final eventServiceProvider = EventServiceProvider._(); diff --git a/app/lib/features/geckoview/domain/repositories/tab.dart b/app/lib/features/geckoview/domain/repositories/tab.dart index 8e31a3a5..94b4c29c 100644 --- a/app/lib/features/geckoview/domain/repositories/tab.dart +++ b/app/lib/features/geckoview/domain/repositories/tab.dart @@ -95,7 +95,6 @@ class TabRepository extends _$TabRepository { final assingedContainer = container ?? Value( - // ignore: only_use_keep_alive_inside_keep_alive await ref.read(selectedContainerProvider.notifier).fetchData(), ); @@ -295,8 +294,7 @@ class TabRepository extends _$TabRepository { } Future _selectNextTab(String tabId) async { - // ignore: only_use_keep_alive_inside_keep_alive - final tabState = ref.read(tabStateProvider(tabId)); + final tabState = ref.read(tabStatesProvider)[tabId]; final currentContainerId = await ref .read(tabDataRepositoryProvider.notifier) @@ -382,13 +380,12 @@ class TabRepository extends _$TabRepository { if (!ref.mounted) return; - final nextContainerTabs = await nextAvailableContainer - .mapNotNull( - (container) => ref - .read(containerRepositoryProvider.notifier) - .getContainerTabIds(container.id) - .then((tabs) => tabs.where((tab) => tab != tabId).toList()), - ); + final nextContainerTabs = await nextAvailableContainer.mapNotNull( + (container) => ref + .read(containerRepositoryProvider.notifier) + .getContainerTabIds(container.id) + .then((tabs) => tabs.where((tab) => tab != tabId).toList()), + ); if (nextContainerTabs.isNotEmpty) { return _tabsService.selectTab(tabId: nextContainerTabs!.first); @@ -446,8 +443,7 @@ class TabRepository extends _$TabRepository { final containerSiteAssignementSub = eventSerivce.siteAssignementEvent.listen( (event) async { if (event.tabId != null) { - // ignore: only_use_keep_alive_inside_keep_alive - final tabState = ref.read(tabStateProvider(event.tabId)); + final tabState = ref.read(tabStatesProvider)[event.tabId]; if (tabState != null) { final uri = Uri.parse(event.url); final originUri = event.originUrl.mapNotNull(Uri.parse); diff --git a/app/lib/features/geckoview/domain/repositories/tab.g.dart b/app/lib/features/geckoview/domain/repositories/tab.g.dart index 2ba3cd20..02d93dc8 100644 --- a/app/lib/features/geckoview/domain/repositories/tab.g.dart +++ b/app/lib/features/geckoview/domain/repositories/tab.g.dart @@ -41,7 +41,7 @@ final class TabRepositoryProvider } } -String _$tabRepositoryHash() => r'b300b88bc7817b533be46d8d0d933786b10212fb'; +String _$tabRepositoryHash() => r'0a676c0513917e8853677ebd592954bde0f15f57'; abstract class _$TabRepository extends $Notifier { void build(); diff --git a/app/lib/features/geckoview/features/bookmarks/presentation/screens/bookmark_entry_edit.dart b/app/lib/features/geckoview/features/bookmarks/presentation/screens/bookmark_entry_edit.dart index 4ee60842..52242437 100644 --- a/app/lib/features/geckoview/features/bookmarks/presentation/screens/bookmark_entry_edit.dart +++ b/app/lib/features/geckoview/features/bookmarks/presentation/screens/bookmark_entry_edit.dart @@ -35,6 +35,7 @@ class BookmarkEntryEditScreen extends HookConsumerWidget { final BookmarkEntry? exisitingEntry; const BookmarkEntryEditScreen({ + super.key, required this.exisitingEntry, required this.initialInfo, }); diff --git a/app/lib/features/geckoview/features/bookmarks/presentation/screens/bookmark_folder_edit.dart b/app/lib/features/geckoview/features/bookmarks/presentation/screens/bookmark_folder_edit.dart index 7cc396fe..398c41d9 100644 --- a/app/lib/features/geckoview/features/bookmarks/presentation/screens/bookmark_folder_edit.dart +++ b/app/lib/features/geckoview/features/bookmarks/presentation/screens/bookmark_folder_edit.dart @@ -32,7 +32,11 @@ class BookmarkFolderEditScreen extends HookConsumerWidget { final String? parentGuid; final BookmarkFolder? folder; - const BookmarkFolderEditScreen({required this.folder, this.parentGuid}); + const BookmarkFolderEditScreen({ + super.key, + required this.folder, + this.parentGuid, + }); @override Widget build(BuildContext context, WidgetRef ref) { diff --git a/app/lib/features/geckoview/features/browser/domain/providers.dart b/app/lib/features/geckoview/features/browser/domain/providers.dart index ef536afd..a66417be 100644 --- a/app/lib/features/geckoview/features/browser/domain/providers.dart +++ b/app/lib/features/geckoview/features/browser/domain/providers.dart @@ -175,7 +175,7 @@ EquatableValue> fifoTabStates(Ref ref) { ]); } -@Riverpod(keepAlive: true) +@Riverpod() EquatableValue> selectedContainerTabStatesWithContainer(Ref ref) { final filter = ref.watch( diff --git a/app/lib/features/geckoview/features/browser/domain/providers.g.dart b/app/lib/features/geckoview/features/browser/domain/providers.g.dart index c25a7d9b..c9beceee 100644 --- a/app/lib/features/geckoview/features/browser/domain/providers.g.dart +++ b/app/lib/features/geckoview/features/browser/domain/providers.g.dart @@ -452,7 +452,7 @@ final class SelectedContainerTabStatesWithContainerProvider argument: null, retry: null, name: r'selectedContainerTabStatesWithContainerProvider', - isAutoDispose: false, + isAutoDispose: true, dependencies: null, $allTransitiveDependencies: null, ); @@ -487,7 +487,7 @@ final class SelectedContainerTabStatesWithContainerProvider } String _$selectedContainerTabStatesWithContainerHash() => - r'd22d16eba89040fbcf7932e5334155f00312957f'; + r'2fd5e12595b3aced1e235c9626073c34655d57fa'; @ProviderFor(suggestedTabEntities) final suggestedTabEntitiesProvider = SuggestedTabEntitiesFamily._(); diff --git a/app/lib/features/geckoview/features/browser/domain/services/engine_settings_replication.dart b/app/lib/features/geckoview/features/browser/domain/services/engine_settings_replication.dart index edac25e9..6b1d1549 100644 --- a/app/lib/features/geckoview/features/browser/domain/services/engine_settings_replication.dart +++ b/app/lib/features/geckoview/features/browser/domain/services/engine_settings_replication.dart @@ -221,7 +221,6 @@ class EngineSettingsReplicationService ); } if (previous.value?.enablePdfJs != settings.enablePdfJs) { - // ignore: only_use_keep_alive_inside_keep_alive await ref .read(preferenceFixatorProvider.notifier) .register('pdfjs.disabled', !settings.enablePdfJs); @@ -230,7 +229,6 @@ class EngineSettingsReplicationService previous.value?.locales, settings.locales, )) { - // ignore: only_use_keep_alive_inside_keep_alive await ref .read(preferenceFixatorProvider.notifier) .register( @@ -240,13 +238,9 @@ class EngineSettingsReplicationService } } else { await _service.setDefaultSettings(settings); - - // ignore: only_use_keep_alive_inside_keep_alive await ref .read(preferenceFixatorProvider.notifier) .register('pdfjs.disabled', !settings.enablePdfJs); - - // ignore: only_use_keep_alive_inside_keep_alive await ref .read(preferenceFixatorProvider.notifier) .register('intl.accept_languages', settings.locales.join(',')); diff --git a/app/lib/features/geckoview/features/browser/domain/services/proxy_settings_replication.dart b/app/lib/features/geckoview/features/browser/domain/services/proxy_settings_replication.dart index 576ed4a9..969e07a8 100644 --- a/app/lib/features/geckoview/features/browser/domain/services/proxy_settings_replication.dart +++ b/app/lib/features/geckoview/features/browser/domain/services/proxy_settings_replication.dart @@ -135,7 +135,6 @@ class ProxySettingsReplication extends _$ProxySettingsReplication { }, ); - // ignore: only_use_keep_alive_inside_keep_alive ref.listen(watchAllAssignedSitesProvider, (previous, next) async { if (next.hasValue) { await ref diff --git a/app/lib/features/geckoview/features/browser/presentation/dialogs/open_shared_content.dart b/app/lib/features/geckoview/features/browser/presentation/dialogs/open_shared_content.dart index 3fdaaa00..ae0a3ea4 100644 --- a/app/lib/features/geckoview/features/browser/presentation/dialogs/open_shared_content.dart +++ b/app/lib/features/geckoview/features/browser/presentation/dialogs/open_shared_content.dart @@ -32,7 +32,7 @@ import 'package:weblibre/utils/form_validators.dart'; class OpenSharedContent extends HookConsumerWidget { final Uri sharedUrl; - const OpenSharedContent({required this.sharedUrl}); + const OpenSharedContent({super.key, required this.sharedUrl}); @override Widget build(BuildContext context, WidgetRef ref) { diff --git a/app/lib/features/geckoview/features/browser/presentation/screens/tab_view.dart b/app/lib/features/geckoview/features/browser/presentation/screens/tab_view.dart index fb04adc8..350302f8 100644 --- a/app/lib/features/geckoview/features/browser/presentation/screens/tab_view.dart +++ b/app/lib/features/geckoview/features/browser/presentation/screens/tab_view.dart @@ -30,7 +30,7 @@ import 'package:weblibre/features/user/domain/repositories/general_settings.dart import 'package:weblibre/presentation/hooks/scroll_visibility.dart'; class TabViewScreen extends HookConsumerWidget { - const TabViewScreen(); + const TabViewScreen({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { diff --git a/app/lib/features/geckoview/features/browser/presentation/widgets/browser_modules/bottom_app_bar.dart b/app/lib/features/geckoview/features/browser/presentation/widgets/browser_modules/bottom_app_bar.dart index f118d5e9..b6efaac4 100644 --- a/app/lib/features/geckoview/features/browser/presentation/widgets/browser_modules/bottom_app_bar.dart +++ b/app/lib/features/geckoview/features/browser/presentation/widgets/browser_modules/bottom_app_bar.dart @@ -68,7 +68,7 @@ class BrowserTopAppBar extends HookConsumerWidget { late final BrowserTabBar _tabBar; late final _size = Size.fromHeight(_tabBar.getToolbarHeight()); - BrowserTopAppBar({ + BrowserTopAppBar({super.key, required this.showMainToolbar, required this.showContextualToolbar, required this.showQuickTabSwitcherBar, @@ -103,7 +103,7 @@ class BrowserBottomAppBar extends HookConsumerWidget { late final BrowserTabBar _tabBar; late final _size = Size.fromHeight(_tabBar.getToolbarHeight()); - BrowserBottomAppBar({ + BrowserBottomAppBar({super.key, required this.showMainToolbar, required this.displayedSheet, required this.showContextualToolbar, @@ -148,7 +148,7 @@ class BrowserTabBar extends HookConsumerWidget { final bool showMainToolbarNavigationButton; final bool showMainToolbarTabActionButton; - const BrowserTabBar({ + const BrowserTabBar({super.key, required this.showMainToolbar, required this.displayedSheet, required this.showContextualToolbar, @@ -476,7 +476,7 @@ class ContextualToolbar extends HookConsumerWidget { class QuickTabSwitcher extends HookConsumerWidget { final QuickTabSwitcherMode quickTabSwitcherMode; - const QuickTabSwitcher({required this.quickTabSwitcherMode}); + const QuickTabSwitcher({super.key, required this.quickTabSwitcherMode}); @override Widget build(BuildContext context, WidgetRef ref) { @@ -685,7 +685,7 @@ class NavigationMenuButton extends StatelessWidget { } class AddTabButton extends HookConsumerWidget { - const AddTabButton(); + const AddTabButton({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { diff --git a/app/lib/features/geckoview/features/browser/presentation/widgets/browser_modules/browser_view.dart b/app/lib/features/geckoview/features/browser/presentation/widgets/browser_modules/browser_view.dart index 60463544..c54f2cb0 100644 --- a/app/lib/features/geckoview/features/browser/presentation/widgets/browser_modules/browser_view.dart +++ b/app/lib/features/geckoview/features/browser/presentation/widgets/browser_modules/browser_view.dart @@ -68,7 +68,7 @@ class BrowserView extends StatefulHookConsumerWidget { final Future Function()? postInitializationStep; final StreamSink? pointerMoveEventSink; - const BrowserView({ + const BrowserView({super.key, this.screenshotPeriod = const Duration(seconds: 10), this.suggestionTimeout = const Duration(seconds: 30), this.postInitializationStep, diff --git a/app/lib/features/geckoview/features/browser/presentation/widgets/certificate_tile.dart b/app/lib/features/geckoview/features/browser/presentation/widgets/certificate_tile.dart index 06460f67..e3bd7fcb 100644 --- a/app/lib/features/geckoview/features/browser/presentation/widgets/certificate_tile.dart +++ b/app/lib/features/geckoview/features/browser/presentation/widgets/certificate_tile.dart @@ -25,7 +25,7 @@ import 'package:skeletonizer/skeletonizer.dart'; import 'package:weblibre/features/geckoview/domain/providers/tab_state.dart'; class CertificateTile extends HookConsumerWidget { - const CertificateTile(); + const CertificateTile({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { diff --git a/app/lib/features/geckoview/features/browser/presentation/widgets/error_container.dart b/app/lib/features/geckoview/features/browser/presentation/widgets/error_container.dart index b5673da6..c16f1c77 100644 --- a/app/lib/features/geckoview/features/browser/presentation/widgets/error_container.dart +++ b/app/lib/features/geckoview/features/browser/presentation/widgets/error_container.dart @@ -22,7 +22,7 @@ import 'package:flutter/material.dart'; class ErrorContainer extends StatelessWidget { final Widget content; - const ErrorContainer({required this.content}); + const ErrorContainer({super.key, required this.content}); @override Widget build(BuildContext context) { diff --git a/app/lib/features/geckoview/features/browser/presentation/widgets/extension_badge_icon.dart b/app/lib/features/geckoview/features/browser/presentation/widgets/extension_badge_icon.dart index b958116a..c6a463be 100644 --- a/app/lib/features/geckoview/features/browser/presentation/widgets/extension_badge_icon.dart +++ b/app/lib/features/geckoview/features/browser/presentation/widgets/extension_badge_icon.dart @@ -25,7 +25,7 @@ import 'package:weblibre/presentation/widgets/safe_raw_image.dart'; class ExtensionBadgeIcon extends StatelessWidget { final WebExtensionState state; - const ExtensionBadgeIcon(this.state); + const ExtensionBadgeIcon(this.state, {super.key}); @override Widget build(BuildContext context) { diff --git a/app/lib/features/geckoview/features/browser/presentation/widgets/sheets/view_tab.dart b/app/lib/features/geckoview/features/browser/presentation/widgets/sheets/view_tab.dart index d72d8592..0326be3e 100644 --- a/app/lib/features/geckoview/features/browser/presentation/widgets/sheets/view_tab.dart +++ b/app/lib/features/geckoview/features/browser/presentation/widgets/sheets/view_tab.dart @@ -52,7 +52,7 @@ class ViewTabSheetWidget extends HookConsumerWidget { final double bottomAppBarHeight; final ValueChanged? onClearSiteDataExpandedChanged; - const ViewTabSheetWidget({ + const ViewTabSheetWidget({super.key, required this.initialTabState, required this.sheetScrollController, required this.draggableScrollableController, diff --git a/app/lib/features/geckoview/features/browser/presentation/widgets/tab_view/tab_view_header.dart b/app/lib/features/geckoview/features/browser/presentation/widgets/tab_view/tab_view_header.dart index 84582868..d540d12a 100644 --- a/app/lib/features/geckoview/features/browser/presentation/widgets/tab_view/tab_view_header.dart +++ b/app/lib/features/geckoview/features/browser/presentation/widgets/tab_view/tab_view_header.dart @@ -44,6 +44,7 @@ import 'package:weblibre/features/geckoview/features/tabs/domain/repositories/ta import 'package:weblibre/features/geckoview/features/tabs/domain/repositories/tab_search.dart'; import 'package:weblibre/features/geckoview/features/tabs/presentation/widgets/container_chips.dart'; import 'package:weblibre/features/tor/presentation/controllers/start_tor_proxy.dart'; +import 'package:weblibre/features/tor/presentation/widgets/tor_dialog.dart'; import 'package:weblibre/features/user/domain/repositories/general_settings.dart'; import 'package:weblibre/presentation/hooks/menu_controller.dart'; import 'package:weblibre/presentation/widgets/speech_to_text_button.dart'; @@ -55,7 +56,11 @@ class TabViewHeader extends HookConsumerWidget { final TabsViewMode tabsViewMode; final VoidCallback onClose; - const TabViewHeader({required this.onClose, required this.tabsViewMode}); + const TabViewHeader({ + super.key, + required this.onClose, + required this.tabsViewMode, + }); @override Widget build(BuildContext context, WidgetRef ref) { @@ -601,9 +606,24 @@ class TabViewHeader extends HookConsumerWidget { if (context.mounted && result == SetContainerResult.successHasProxy) { - await ref + final shouldStartProxy = await ref .read(startProxyControllerProvider.notifier) - .maybeStartProxy(context); + .shouldPromptProxyStart(); + + if (!context.mounted || !shouldStartProxy) return; + + final dialogResult = await showDialog( + context: context, + builder: (context) { + return const TorDialog(); + }, + ); + + if (dialogResult == true) { + await ref + .read(startProxyControllerProvider.notifier) + .startProxy(); + } } } else { ref diff --git a/app/lib/features/geckoview/features/preferences/data/repositories/preference_observer.dart b/app/lib/features/geckoview/features/preferences/data/repositories/preference_observer.dart index 22853b5c..e89835f8 100644 --- a/app/lib/features/geckoview/features/preferences/data/repositories/preference_observer.dart +++ b/app/lib/features/geckoview/features/preferences/data/repositories/preference_observer.dart @@ -25,7 +25,7 @@ import 'package:weblibre/features/geckoview/domain/providers.dart'; part 'preference_observer.g.dart'; -@Riverpod() +@Riverpod(keepAlive: true) class PreferenceChangeListener extends _$PreferenceChangeListener { @override Stream build() async* { @@ -41,7 +41,7 @@ class PreferenceChangeListener extends _$PreferenceChangeListener { } } -@Riverpod() +@Riverpod(keepAlive: true) class PreferenceFixator extends _$PreferenceFixator { Future register(String name, Object value) async { state = {...state} diff --git a/app/lib/features/geckoview/features/preferences/data/repositories/preference_observer.g.dart b/app/lib/features/geckoview/features/preferences/data/repositories/preference_observer.g.dart index fccf5fcf..91aeeea5 100644 --- a/app/lib/features/geckoview/features/preferences/data/repositories/preference_observer.g.dart +++ b/app/lib/features/geckoview/features/preferences/data/repositories/preference_observer.g.dart @@ -20,7 +20,7 @@ final class PreferenceChangeListenerProvider argument: null, retry: null, name: r'preferenceChangeListenerProvider', - isAutoDispose: true, + isAutoDispose: false, dependencies: null, $allTransitiveDependencies: null, ); @@ -34,7 +34,7 @@ final class PreferenceChangeListenerProvider } String _$preferenceChangeListenerHash() => - r'668c1bcd0636ec515a5e92ee5ba4ea7a67fa7a6d'; + r'de9759b32a6a6b9bab5656137a365da78633f866'; abstract class _$PreferenceChangeListener extends $StreamNotifier { Stream build(); @@ -65,7 +65,7 @@ final class PreferenceFixatorProvider argument: null, retry: null, name: r'preferenceFixatorProvider', - isAutoDispose: true, + isAutoDispose: false, dependencies: null, $allTransitiveDependencies: null, ); @@ -86,7 +86,7 @@ final class PreferenceFixatorProvider } } -String _$preferenceFixatorHash() => r'c76245d5c420e2e3f6c026f23c017c939b69ef59'; +String _$preferenceFixatorHash() => r'c8d71966faf6b2feb9ac4e770297cd298edf5211'; abstract class _$PreferenceFixator extends $Notifier> { Map build(); diff --git a/app/lib/features/geckoview/features/search/presentation/screens/search.dart b/app/lib/features/geckoview/features/search/presentation/screens/search.dart index 399517dc..d5c11715 100644 --- a/app/lib/features/geckoview/features/search/presentation/screens/search.dart +++ b/app/lib/features/geckoview/features/search/presentation/screens/search.dart @@ -59,7 +59,7 @@ class SearchScreen extends HookConsumerWidget { /// When null, a new tab will be created. final String? tabId; - const SearchScreen({ + const SearchScreen({super.key, required this.initialSearchText, required this.tabType, this.launchedFromIntent = false, diff --git a/app/lib/features/geckoview/features/search/presentation/widgets/search_modules/feed_search.dart b/app/lib/features/geckoview/features/search/presentation/widgets/search_modules/feed_search.dart index 1e5a0f98..6ac21320 100644 --- a/app/lib/features/geckoview/features/search/presentation/widgets/search_modules/feed_search.dart +++ b/app/lib/features/geckoview/features/search/presentation/widgets/search_modules/feed_search.dart @@ -42,7 +42,7 @@ class FeedSearch extends HookConsumerWidget { final ValueListenable searchTextNotifier; - const FeedSearch({required this.searchTextNotifier}); + const FeedSearch({super.key, required this.searchTextNotifier}); @override Widget build(BuildContext context, WidgetRef ref) { diff --git a/app/lib/features/geckoview/features/search/presentation/widgets/search_modules/tab_search.dart b/app/lib/features/geckoview/features/search/presentation/widgets/search_modules/tab_search.dart index dcc25311..531cddf3 100644 --- a/app/lib/features/geckoview/features/search/presentation/widgets/search_modules/tab_search.dart +++ b/app/lib/features/geckoview/features/search/presentation/widgets/search_modules/tab_search.dart @@ -50,7 +50,7 @@ class TabSearch extends HookConsumerWidget { final ValueListenable searchTextListenable; - const TabSearch({required this.searchTextListenable}); + const TabSearch({super.key, required this.searchTextListenable}); @override Widget build(BuildContext context, WidgetRef ref) { @@ -76,7 +76,7 @@ class TabSearch extends HookConsumerWidget { .fold( {}, (map, id) => - map..update(id, (value) => ++value, ifAbsent: () => 1), + map..update(id, (value) => value + 1, ifAbsent: () => 1), ), ), [tabSearchResults], diff --git a/app/lib/features/geckoview/features/tabs/domain/providers.dart b/app/lib/features/geckoview/features/tabs/domain/providers.dart index e5415aa5..f4cc1ebe 100644 --- a/app/lib/features/geckoview/features/tabs/domain/providers.dart +++ b/app/lib/features/geckoview/features/tabs/domain/providers.dart @@ -149,7 +149,7 @@ Stream> watchTabsContainerId( .map(Map.fromEntries); } -@Riverpod() +@Riverpod(keepAlive: true) Stream> watchAllAssignedSites(Ref ref) { final db = ref.watch(tabDatabaseProvider); return db.containerDao.allAssignedSites().watch(); diff --git a/app/lib/features/geckoview/features/tabs/domain/providers.g.dart b/app/lib/features/geckoview/features/tabs/domain/providers.g.dart index 2094487c..558ea964 100644 --- a/app/lib/features/geckoview/features/tabs/domain/providers.g.dart +++ b/app/lib/features/geckoview/features/tabs/domain/providers.g.dart @@ -848,7 +848,7 @@ final class WatchAllAssignedSitesProvider argument: null, retry: null, name: r'watchAllAssignedSitesProvider', - isAutoDispose: true, + isAutoDispose: false, dependencies: null, $allTransitiveDependencies: null, ); @@ -869,7 +869,7 @@ final class WatchAllAssignedSitesProvider } String _$watchAllAssignedSitesHash() => - r'0e06caeb4a53b5cf976b3f47d328ea238243438b'; + r'5f658b5733ee20192eb86d3aeb79aa9678dafba8'; @ProviderFor(watchIsCurrentSiteAssignedToContainer) final watchIsCurrentSiteAssignedToContainerProvider = diff --git a/app/lib/features/geckoview/features/tabs/domain/repositories/tab.dart b/app/lib/features/geckoview/features/tabs/domain/repositories/tab.dart index 4d8bc001..26bcc65b 100644 --- a/app/lib/features/geckoview/features/tabs/domain/repositories/tab.dart +++ b/app/lib/features/geckoview/features/tabs/domain/repositories/tab.dart @@ -46,7 +46,7 @@ class TabDataRepository extends _$TabDataRepository { .tabDao .assignContainer(tabId, containerId: targetContainer.id); } else { - final tabState = ref.read(tabStateProvider(tabId)); + final tabState = ref.read(tabStatesProvider)[tabId]; if (tabState != null) { if (closeOldTab) { await ref.read(tabRepositoryProvider.notifier).closeTab(tabId); @@ -76,7 +76,7 @@ class TabDataRepository extends _$TabDataRepository { .tabDao .assignContainer(tabId, containerId: null); } else { - final tabState = ref.read(tabStateProvider(tabId)); + final tabState = ref.read(tabStatesProvider)[tabId]; if (tabState != null) { await ref.read(tabRepositoryProvider.notifier).closeTab(tabId); diff --git a/app/lib/features/geckoview/features/tabs/domain/repositories/tab.g.dart b/app/lib/features/geckoview/features/tabs/domain/repositories/tab.g.dart index 8a993036..cea300d3 100644 --- a/app/lib/features/geckoview/features/tabs/domain/repositories/tab.g.dart +++ b/app/lib/features/geckoview/features/tabs/domain/repositories/tab.g.dart @@ -41,7 +41,7 @@ final class TabDataRepositoryProvider } } -String _$tabDataRepositoryHash() => r'c3632e0a2d91811103b329659cb0c6d778b14cea'; +String _$tabDataRepositoryHash() => r'c872509a70e4c0c029b468457e15c5e5bff10c65'; abstract class _$TabDataRepository extends $Notifier { void build(); diff --git a/app/lib/features/geckoview/features/tabs/presentation/controllers/container_topic.dart b/app/lib/features/geckoview/features/tabs/presentation/controllers/container_topic.dart index 1515c7b4..01e54bba 100644 --- a/app/lib/features/geckoview/features/tabs/presentation/controllers/container_topic.dart +++ b/app/lib/features/geckoview/features/tabs/presentation/controllers/container_topic.dart @@ -37,7 +37,7 @@ class ContainerTopicController extends _$ContainerTopicController { return _predictFromTitles(titles); } - Future predictTopicFromTabIds(Set tabIds) async { + Future predictTopicFromTabIds(Set tabIds) { final tabStates = ref.read(tabStatesProvider); final titles = tabIds .map((tabId) => tabStates[tabId]?.title) diff --git a/app/lib/features/geckoview/features/tabs/presentation/controllers/container_topic.g.dart b/app/lib/features/geckoview/features/tabs/presentation/controllers/container_topic.g.dart index 298dad9a..dfe373b1 100644 --- a/app/lib/features/geckoview/features/tabs/presentation/controllers/container_topic.g.dart +++ b/app/lib/features/geckoview/features/tabs/presentation/controllers/container_topic.g.dart @@ -42,7 +42,7 @@ final class ContainerTopicControllerProvider } String _$containerTopicControllerHash() => - r'0b54e0be899e2abb4defbd5614ba231917ad74e5'; + r'41ee4b2a259eba17af49b3c877a9b10ea51281c8'; abstract class _$ContainerTopicController extends $Notifier> { AsyncValue build(); diff --git a/app/lib/features/geckoview/features/tabs/presentation/screens/container_list.dart b/app/lib/features/geckoview/features/tabs/presentation/screens/container_list.dart index 0f156f9e..63cb44f7 100644 --- a/app/lib/features/geckoview/features/tabs/presentation/screens/container_list.dart +++ b/app/lib/features/geckoview/features/tabs/presentation/screens/container_list.dart @@ -31,10 +31,11 @@ import 'package:weblibre/features/geckoview/features/tabs/domain/providers/selec import 'package:weblibre/features/geckoview/features/tabs/domain/repositories/container.dart'; import 'package:weblibre/features/geckoview/features/tabs/presentation/widgets/container_list_tile.dart'; import 'package:weblibre/features/tor/presentation/controllers/start_tor_proxy.dart'; +import 'package:weblibre/features/tor/presentation/widgets/tor_dialog.dart'; import 'package:weblibre/presentation/widgets/failure_widget.dart'; class ContainerListScreen extends HookConsumerWidget { - const ContainerListScreen(); + const ContainerListScreen({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { @@ -70,9 +71,28 @@ class ContainerListScreen extends HookConsumerWidget { if (context.mounted && result == SetContainerResult.successHasProxy) { - await ref + final shouldStartProxy = await ref .read(startProxyControllerProvider.notifier) - .maybeStartProxy(context); + .shouldPromptProxyStart(); + + if (!context.mounted || !shouldStartProxy) { + return; + } + + final dialogResult = await showDialog( + context: context, + builder: (context) { + return const TorDialog(); + }, + ); + + if (dialogResult == true) { + await ref + .read( + startProxyControllerProvider.notifier, + ) + .startProxy(); + } } }, foregroundColor: Theme.of( diff --git a/app/lib/features/geckoview/features/tabs/presentation/screens/container_selection.dart b/app/lib/features/geckoview/features/tabs/presentation/screens/container_selection.dart index 932df227..2aedb78e 100644 --- a/app/lib/features/geckoview/features/tabs/presentation/screens/container_selection.dart +++ b/app/lib/features/geckoview/features/tabs/presentation/screens/container_selection.dart @@ -33,7 +33,7 @@ import 'package:weblibre/features/geckoview/features/tabs/presentation/widgets/c import 'package:weblibre/presentation/widgets/failure_widget.dart'; class ContainerSelectionScreen extends HookConsumerWidget { - const ContainerSelectionScreen(); + const ContainerSelectionScreen({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { diff --git a/app/lib/features/geckoview/features/tabs/presentation/widgets/color_picker_dialog.dart b/app/lib/features/geckoview/features/tabs/presentation/widgets/color_picker_dialog.dart index 026cf36f..3116492a 100644 --- a/app/lib/features/geckoview/features/tabs/presentation/widgets/color_picker_dialog.dart +++ b/app/lib/features/geckoview/features/tabs/presentation/widgets/color_picker_dialog.dart @@ -25,7 +25,7 @@ import 'package:weblibre/features/geckoview/features/tabs/utils/container_colors class ColorPickerDialog extends HookWidget { final Color initialColor; - const ColorPickerDialog(this.initialColor); + const ColorPickerDialog(this.initialColor, {super.key}); @override Widget build(BuildContext context) { diff --git a/app/lib/features/geckoview/features/tabs/presentation/widgets/container_chips.dart b/app/lib/features/geckoview/features/tabs/presentation/widgets/container_chips.dart index b3afff84..0285dbfb 100644 --- a/app/lib/features/geckoview/features/tabs/presentation/widgets/container_chips.dart +++ b/app/lib/features/geckoview/features/tabs/presentation/widgets/container_chips.dart @@ -145,7 +145,7 @@ class ContainerChips extends HookConsumerWidget { final ValueListenable? searchTextListenable; - const ContainerChips({ + const ContainerChips({super.key, required this.selectedContainer, required this.onSelected, required this.onDeleted, diff --git a/app/lib/features/qr_scanner/presentation/dialogs/qr_scanner_dialog.dart b/app/lib/features/qr_scanner/presentation/dialogs/qr_scanner_dialog.dart index 48e17c75..92b76502 100644 --- a/app/lib/features/qr_scanner/presentation/dialogs/qr_scanner_dialog.dart +++ b/app/lib/features/qr_scanner/presentation/dialogs/qr_scanner_dialog.dart @@ -25,6 +25,8 @@ import 'package:qr_code_scanner_plus/qr_code_scanner_plus.dart'; import 'package:weblibre/utils/ui_helper.dart' as ui_helper; class QrScannerDialog extends HookWidget { + const QrScannerDialog({super.key}); + @override Widget build(BuildContext context) { final qrKey = useMemoized(() => GlobalKey(debugLabel: 'qr_scanner')); diff --git a/app/lib/features/settings/presentation/screens/doh_settings.dart b/app/lib/features/settings/presentation/screens/doh_settings.dart index ee281c4d..1728be79 100644 --- a/app/lib/features/settings/presentation/screens/doh_settings.dart +++ b/app/lib/features/settings/presentation/screens/doh_settings.dart @@ -28,7 +28,7 @@ import 'package:weblibre/features/user/domain/repositories/engine_settings.dart' import 'package:weblibre/utils/form_validators.dart'; class DohSettingsScreen extends HookConsumerWidget { - const DohSettingsScreen(); + const DohSettingsScreen({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { diff --git a/app/lib/features/settings/presentation/screens/fingerprint_settings.dart b/app/lib/features/settings/presentation/screens/fingerprint_settings.dart index 3281716a..5c4c22b6 100644 --- a/app/lib/features/settings/presentation/screens/fingerprint_settings.dart +++ b/app/lib/features/settings/presentation/screens/fingerprint_settings.dart @@ -29,7 +29,7 @@ import 'package:weblibre/features/user/domain/services/fingerprinting.dart'; import 'package:weblibre/presentation/widgets/failure_widget.dart'; class FingerprintSettingsScreen extends HookConsumerWidget { - const FingerprintSettingsScreen(); + const FingerprintSettingsScreen({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { diff --git a/app/lib/features/settings/presentation/screens/locale_settings.dart b/app/lib/features/settings/presentation/screens/locale_settings.dart index 1b452c53..9733dac1 100644 --- a/app/lib/features/settings/presentation/screens/locale_settings.dart +++ b/app/lib/features/settings/presentation/screens/locale_settings.dart @@ -31,7 +31,7 @@ import 'package:weblibre/features/user/data/models/engine_settings.dart'; import 'package:weblibre/features/user/domain/repositories/engine_settings.dart'; class LocaleSettingsScreen extends HookConsumerWidget { - const LocaleSettingsScreen(); + const LocaleSettingsScreen({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { diff --git a/app/lib/features/settings/presentation/screens/web_engine_hardening.dart b/app/lib/features/settings/presentation/screens/web_engine_hardening.dart index 5360cea9..b77bb7b8 100644 --- a/app/lib/features/settings/presentation/screens/web_engine_hardening.dart +++ b/app/lib/features/settings/presentation/screens/web_engine_hardening.dart @@ -29,7 +29,7 @@ import 'package:weblibre/features/settings/presentation/widgets/hardening_group_ import 'package:weblibre/presentation/widgets/failure_widget.dart'; class WebEngineHardeningScreen extends HookConsumerWidget { - const WebEngineHardeningScreen(); + const WebEngineHardeningScreen({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { diff --git a/app/lib/features/settings/presentation/widgets/default_search_selector.dart b/app/lib/features/settings/presentation/widgets/default_search_selector.dart index 5910ea08..96a4bcc0 100644 --- a/app/lib/features/settings/presentation/widgets/default_search_selector.dart +++ b/app/lib/features/settings/presentation/widgets/default_search_selector.dart @@ -28,7 +28,7 @@ import 'package:weblibre/presentation/widgets/selectable_chips.dart'; import 'package:weblibre/presentation/widgets/url_icon.dart'; class DefaultSearchSelector extends HookConsumerWidget { - const DefaultSearchSelector(); + const DefaultSearchSelector({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { diff --git a/app/lib/features/settings/presentation/widgets/sections.dart b/app/lib/features/settings/presentation/widgets/sections.dart index db74d4a6..22dec211 100644 --- a/app/lib/features/settings/presentation/widgets/sections.dart +++ b/app/lib/features/settings/presentation/widgets/sections.dart @@ -22,7 +22,7 @@ import 'package:flutter/material.dart'; class SettingSection extends StatelessWidget { final String name; - const SettingSection({required this.name}); + const SettingSection({super.key, required this.name}); @override Widget build(BuildContext context) { @@ -43,7 +43,7 @@ class SettingSection extends StatelessWidget { class SettingSubSection extends StatelessWidget { final String name; - const SettingSubSection({required this.name}); + const SettingSubSection({super.key, required this.name}); @override Widget build(BuildContext context) { diff --git a/app/lib/features/settings/presentation/widgets/sync_details_table.dart b/app/lib/features/settings/presentation/widgets/sync_details_table.dart index 9dd4d246..6650046b 100644 --- a/app/lib/features/settings/presentation/widgets/sync_details_table.dart +++ b/app/lib/features/settings/presentation/widgets/sync_details_table.dart @@ -25,7 +25,7 @@ class SyncDetailsTable extends StatelessWidget { final int? count; final DateTime? lastSync; - const SyncDetailsTable(this.count, this.lastSync); + const SyncDetailsTable(this.count, this.lastSync, {super.key}); @override Widget build(BuildContext context) { diff --git a/app/lib/features/tor/domain/services/tor_proxy.dart b/app/lib/features/tor/domain/services/tor_proxy.dart index c6adae68..0bbbbfcf 100644 --- a/app/lib/features/tor/domain/services/tor_proxy.dart +++ b/app/lib/features/tor/domain/services/tor_proxy.dart @@ -65,7 +65,6 @@ class TorProxyService extends _$TorProxyService { if (config == null && torSettings.requireBridge) { config = MoatService.convertBuiltinToSettings( - // ignore: only_use_keep_alive_inside_keep_alive await ref .read(builtinBridgesRepositoryProvider(moat).notifier) .getBridges(), @@ -99,7 +98,6 @@ class TorProxyService extends _$TorProxyService { if (config == null && (torSettings.requireBridge || !torSettings.fetchRemoteBridges)) { config = MoatService.convertBuiltinToSettings( - // ignore: only_use_keep_alive_inside_keep_alive await ref .read(builtinBridgesRepositoryProvider(moat).notifier) .getBridges(tryUpdate: torSettings.fetchRemoteBridges), diff --git a/app/lib/features/tor/presentation/controllers/start_tor_proxy.dart b/app/lib/features/tor/presentation/controllers/start_tor_proxy.dart index a40a51e4..4d40ee8a 100644 --- a/app/lib/features/tor/presentation/controllers/start_tor_proxy.dart +++ b/app/lib/features/tor/presentation/controllers/start_tor_proxy.dart @@ -17,51 +17,49 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ -import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:weblibre/features/geckoview/domain/controllers/overlay.dart'; import 'package:weblibre/features/tor/domain/services/tor_proxy.dart'; -import 'package:weblibre/features/tor/presentation/widgets/tor_dialog.dart'; import 'package:weblibre/features/tor/presentation/widgets/tor_notification.dart'; part 'start_tor_proxy.g.dart'; @Riverpod(keepAlive: true) class StartProxyController extends _$StartProxyController { - // ignore: document_ignores is used for dialog - // ignore: avoid_build_context_in_providers - Future maybeStartProxy(BuildContext context) async { + Future shouldPromptProxyStart() async { final currentStatus = await ref .read(torProxyServiceProvider.notifier) .requestSync(); - if (!currentStatus.isRunning) { - if (context.mounted) { - final result = await showDialog( - context: context, - builder: (context) { - return const TorDialog(); - }, - ); + return !currentStatus.isRunning; + } - if (result == true) { - final connection = ref - .read(torProxyServiceProvider.notifier) - .startOrReconfigure(reconfigureIfRunning: false); + Future startProxy() async { + if (state) return; - ref - .read(overlayControllerProvider.notifier) - .show( - (context) => - Positioned(top: 0, left: 0, child: TorNotification()), - ); + state = true; - await connection; - } - } + try { + final connection = ref + .read(torProxyServiceProvider.notifier) + .startOrReconfigure(reconfigureIfRunning: false); + + ref + .read(overlayControllerProvider.notifier) + .show( + (context) => + const Positioned(top: 0, left: 0, child: TorNotification()), + ); + + await connection; + } finally { + state = false; } } @override - void build() {} + bool build() { + return false; + } } diff --git a/app/lib/features/tor/presentation/controllers/start_tor_proxy.g.dart b/app/lib/features/tor/presentation/controllers/start_tor_proxy.g.dart index cec88072..c660beb9 100644 --- a/app/lib/features/tor/presentation/controllers/start_tor_proxy.g.dart +++ b/app/lib/features/tor/presentation/controllers/start_tor_proxy.g.dart @@ -13,7 +13,7 @@ part of 'start_tor_proxy.dart'; final startProxyControllerProvider = StartProxyControllerProvider._(); final class StartProxyControllerProvider - extends $NotifierProvider { + extends $NotifierProvider { StartProxyControllerProvider._() : super( from: null, @@ -33,28 +33,28 @@ final class StartProxyControllerProvider StartProxyController create() => StartProxyController(); /// {@macro riverpod.override_with_value} - Override overrideWithValue(void value) { + Override overrideWithValue(bool value) { return $ProviderOverride( origin: this, - providerOverride: $SyncValueProvider(value), + providerOverride: $SyncValueProvider(value), ); } } String _$startProxyControllerHash() => - r'13c6ad9611a2f9525689d370a0511274aa9c0f03'; + r'899b585bf7f220251ac92f11c79537cc07723241'; -abstract class _$StartProxyController extends $Notifier { - void build(); +abstract class _$StartProxyController extends $Notifier { + bool build(); @$mustCallSuper @override void runBuild() { - final ref = this.ref as $Ref; + final ref = this.ref as $Ref; final element = ref.element as $ClassProviderElement< - AnyNotifier, - void, + AnyNotifier, + bool, Object?, Object? >; diff --git a/app/lib/features/tor/presentation/screens/country_picker.dart b/app/lib/features/tor/presentation/screens/country_picker.dart index d5a52c8b..0fdfb7d0 100644 --- a/app/lib/features/tor/presentation/screens/country_picker.dart +++ b/app/lib/features/tor/presentation/screens/country_picker.dart @@ -30,6 +30,7 @@ const automaticCountry = ''; class CountryPickerScreen extends HookWidget { const CountryPickerScreen({ + super.key, required this.title, this.selectedCountryCode, }); @@ -51,20 +52,16 @@ class CountryPickerScreen extends HookWidget { country.countryCode ?? 'Unnamed Country'; return (alpha2Code: country.alpha2Code, label: label); - }).toList() - ..sort((a, b) => a.label.compareTo(b.label)); + }).toList()..sort((a, b) => a.label.compareTo(b.label)); }); - final filteredCountries = useMemoized( - () { - if (searchQuery.value.isEmpty) return countries; - final query = searchQuery.value.toLowerCase(); - return countries - .where((c) => c.label.toLowerCase().contains(query)) - .toList(); - }, - [searchQuery.value, countries], - ); + final filteredCountries = useMemoized(() { + if (searchQuery.value.isEmpty) return countries; + final query = searchQuery.value.toLowerCase(); + return countries + .where((c) => c.label.toLowerCase().contains(query)) + .toList(); + }, [searchQuery.value, countries]); return Scaffold( appBar: AppBar( @@ -95,7 +92,7 @@ class CountryPickerScreen extends HookWidget { borderRadius: BorderRadius.circular(8), borderSide: BorderSide.none, ), - contentPadding: const EdgeInsets.symmetric(vertical: 0), + contentPadding: EdgeInsets.zero, ), onChanged: (value) => searchQuery.value = value, ), diff --git a/app/lib/features/tor/presentation/screens/tor_proxy.dart b/app/lib/features/tor/presentation/screens/tor_proxy.dart index eb6084f3..f2ceac28 100644 --- a/app/lib/features/tor/presentation/screens/tor_proxy.dart +++ b/app/lib/features/tor/presentation/screens/tor_proxy.dart @@ -24,9 +24,9 @@ import 'package:flutter_material_design_icons/flutter_material_design_icons.dart import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:nullability/nullability.dart'; import 'package:weblibre/core/design/app_colors.dart'; +import 'package:weblibre/core/routing/routes.dart'; import 'package:weblibre/features/settings/presentation/controllers/save_settings.dart'; import 'package:weblibre/features/tor/domain/services/tor_proxy.dart'; -import 'package:weblibre/core/routing/routes.dart'; import 'package:weblibre/features/tor/presentation/screens/country_picker.dart'; import 'package:weblibre/features/user/data/models/tor_settings.dart'; import 'package:weblibre/features/user/domain/repositories/tor_settings.dart'; @@ -34,7 +34,7 @@ import 'package:weblibre/presentation/hooks/on_initialization.dart'; import 'package:weblibre/utils/ui_helper.dart'; class TorProxyScreen extends HookConsumerWidget { - const TorProxyScreen(); + const TorProxyScreen({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { @@ -465,7 +465,8 @@ class TorProxyScreen extends HookConsumerWidget { ), ListTile( enabled: !torIsBusy, - leading: torSettings.entryNodeCountry.mapNotNull( + leading: + torSettings.entryNodeCountry.mapNotNull( (code) => CountryFlag.fromCountryCode( code, theme: const EmojiTheme(size: 28), @@ -486,8 +487,9 @@ class TorProxyScreen extends HookConsumerWidget { $extra: torSettings.entryNodeCountry, ).push(context); if (result == null) return; - final value = - result == automaticCountry ? null : result; + final value = result == automaticCountry + ? null + : result; await ref .read(saveTorSettingsControllerProvider.notifier) .save( @@ -498,7 +500,8 @@ class TorProxyScreen extends HookConsumerWidget { ), ListTile( enabled: !torIsBusy, - leading: torSettings.exitNodeCountry.mapNotNull( + leading: + torSettings.exitNodeCountry.mapNotNull( (code) => CountryFlag.fromCountryCode( code, theme: const EmojiTheme(size: 28), @@ -519,8 +522,9 @@ class TorProxyScreen extends HookConsumerWidget { $extra: torSettings.exitNodeCountry, ).push(context); if (result == null) return; - final value = - result == automaticCountry ? null : result; + final value = result == automaticCountry + ? null + : result; await ref .read(saveTorSettingsControllerProvider.notifier) .save( diff --git a/app/lib/features/tor/presentation/widgets/tor_dialog.dart b/app/lib/features/tor/presentation/widgets/tor_dialog.dart index a26fe126..a4120098 100644 --- a/app/lib/features/tor/presentation/widgets/tor_dialog.dart +++ b/app/lib/features/tor/presentation/widgets/tor_dialog.dart @@ -23,7 +23,7 @@ import 'package:weblibre/core/design/app_colors.dart'; import 'package:weblibre/presentation/icons/tor_icons.dart'; class TorDialog extends StatelessWidget { - const TorDialog(); + const TorDialog({super.key}); @override Widget build(BuildContext context) { diff --git a/app/lib/features/tor/presentation/widgets/tor_notification.dart b/app/lib/features/tor/presentation/widgets/tor_notification.dart index 69b341d3..fca35926 100644 --- a/app/lib/features/tor/presentation/widgets/tor_notification.dart +++ b/app/lib/features/tor/presentation/widgets/tor_notification.dart @@ -26,6 +26,8 @@ import 'package:weblibre/presentation/icons/tor_icons.dart'; import 'package:weblibre/presentation/widgets/animate_gradient_shader.dart'; class TorNotification extends HookConsumerWidget { + const TorNotification({super.key}); + @override Widget build(BuildContext context, WidgetRef ref) { final appColors = AppColors.of(context); diff --git a/app/lib/features/user/domain/presentation/dialogs/select_profile.dart b/app/lib/features/user/domain/presentation/dialogs/select_profile.dart index 798af17b..7adf4794 100644 --- a/app/lib/features/user/domain/presentation/dialogs/select_profile.dart +++ b/app/lib/features/user/domain/presentation/dialogs/select_profile.dart @@ -31,7 +31,7 @@ import 'package:weblibre/presentation/widgets/failure_widget.dart'; /// Bottom sheet widget to select a user profile. class SelectProfileDialog extends HookConsumerWidget { - const SelectProfileDialog(); + const SelectProfileDialog({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { diff --git a/app/lib/features/user/domain/presentation/screens/profile_backup.dart b/app/lib/features/user/domain/presentation/screens/profile_backup.dart index e42d8bed..1c1d433a 100644 --- a/app/lib/features/user/domain/presentation/screens/profile_backup.dart +++ b/app/lib/features/user/domain/presentation/screens/profile_backup.dart @@ -31,7 +31,7 @@ import 'package:weblibre/utils/ui_helper.dart'; class ProfileBackupScreen extends HookConsumerWidget { final Profile profile; - const ProfileBackupScreen({required this.profile}); + const ProfileBackupScreen({super.key, required this.profile}); @override Widget build(BuildContext context, WidgetRef ref) { diff --git a/app/lib/features/user/domain/presentation/screens/profile_backup_list.dart b/app/lib/features/user/domain/presentation/screens/profile_backup_list.dart index 262c27d9..438755ad 100644 --- a/app/lib/features/user/domain/presentation/screens/profile_backup_list.dart +++ b/app/lib/features/user/domain/presentation/screens/profile_backup_list.dart @@ -31,7 +31,7 @@ final _filenamePattern = RegExp( ); class ProfileBackupListScreen extends HookConsumerWidget { - const ProfileBackupListScreen(); + const ProfileBackupListScreen({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { diff --git a/app/lib/features/user/domain/presentation/screens/profile_edit.dart b/app/lib/features/user/domain/presentation/screens/profile_edit.dart index bf816cb3..d4d18711 100644 --- a/app/lib/features/user/domain/presentation/screens/profile_edit.dart +++ b/app/lib/features/user/domain/presentation/screens/profile_edit.dart @@ -46,7 +46,7 @@ const _timeoutOptions = >[ class ProfileEditScreen extends HookConsumerWidget { final Profile? profile; - const ProfileEditScreen({required this.profile}); + const ProfileEditScreen({super.key, required this.profile}); Future _handleSave( BuildContext context, diff --git a/app/lib/features/user/domain/presentation/screens/profile_list.dart b/app/lib/features/user/domain/presentation/screens/profile_list.dart index 7595f945..75f97c8d 100644 --- a/app/lib/features/user/domain/presentation/screens/profile_list.dart +++ b/app/lib/features/user/domain/presentation/screens/profile_list.dart @@ -28,7 +28,7 @@ import 'package:weblibre/features/user/domain/repositories/profile.dart'; import 'package:weblibre/presentation/widgets/failure_widget.dart'; class ProfileListScreen extends HookConsumerWidget { - const ProfileListScreen(); + const ProfileListScreen({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { diff --git a/app/lib/features/user/domain/presentation/widgets/auth_gate.dart b/app/lib/features/user/domain/presentation/widgets/auth_gate.dart index da6ddbad..fe6f13e0 100644 --- a/app/lib/features/user/domain/presentation/widgets/auth_gate.dart +++ b/app/lib/features/user/domain/presentation/widgets/auth_gate.dart @@ -27,7 +27,7 @@ import 'package:weblibre/features/user/domain/providers/profile_auth.dart'; import 'package:weblibre/presentation/hooks/on_initialization.dart'; class LockScreen extends HookConsumerWidget { - const LockScreen(); + const LockScreen({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { diff --git a/app/lib/features/web_feed/presentation/screens/feed_article_list.dart b/app/lib/features/web_feed/presentation/screens/feed_article_list.dart index 713dbb45..980234e9 100644 --- a/app/lib/features/web_feed/presentation/screens/feed_article_list.dart +++ b/app/lib/features/web_feed/presentation/screens/feed_article_list.dart @@ -32,7 +32,7 @@ import 'package:weblibre/presentation/widgets/speech_to_text_button.dart'; class FeedArticleListScreen extends HookConsumerWidget { final Uri? feedId; - const FeedArticleListScreen({required this.feedId}); + const FeedArticleListScreen({super.key, required this.feedId}); @override Widget build(BuildContext context, WidgetRef ref) { diff --git a/app/lib/features/web_feed/presentation/screens/feed_list.dart b/app/lib/features/web_feed/presentation/screens/feed_list.dart index aaa19974..f500f31f 100644 --- a/app/lib/features/web_feed/presentation/screens/feed_list.dart +++ b/app/lib/features/web_feed/presentation/screens/feed_list.dart @@ -28,7 +28,7 @@ import 'package:weblibre/features/web_feed/presentation/widgets/feed_card.dart'; import 'package:weblibre/presentation/widgets/failure_widget.dart'; class FeedListScreen extends HookConsumerWidget { - const FeedListScreen(); + const FeedListScreen({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { diff --git a/app/lib/features/web_feed/presentation/select_feed_dialog.dart b/app/lib/features/web_feed/presentation/select_feed_dialog.dart index 14939975..b655fdb4 100644 --- a/app/lib/features/web_feed/presentation/select_feed_dialog.dart +++ b/app/lib/features/web_feed/presentation/select_feed_dialog.dart @@ -29,7 +29,7 @@ import 'package:weblibre/presentation/widgets/failure_widget.dart'; class SelectFeedDialog extends HookConsumerWidget { final Set feedUris; - const SelectFeedDialog({required this.feedUris}); + const SelectFeedDialog({super.key, required this.feedUris}); @override Widget build(BuildContext context, WidgetRef ref) { diff --git a/app/lib/features/web_feed/presentation/widgets/authors_horizontal_list.dart b/app/lib/features/web_feed/presentation/widgets/authors_horizontal_list.dart index 58f03d71..b98f41d9 100644 --- a/app/lib/features/web_feed/presentation/widgets/authors_horizontal_list.dart +++ b/app/lib/features/web_feed/presentation/widgets/authors_horizontal_list.dart @@ -25,7 +25,7 @@ import 'package:weblibre/features/web_feed/data/models/feed_author.dart'; class AuthorsHorizontalList extends StatelessWidget { late final List _authors; - AuthorsHorizontalList({ + AuthorsHorizontalList({super.key, required List authors, Set selectedTags = const {}, void Function(String tagId, bool value)? onTagSelected, diff --git a/app/lib/features/web_feed/presentation/widgets/tags_horizontal_list.dart b/app/lib/features/web_feed/presentation/widgets/tags_horizontal_list.dart index c1f5de8e..33016cb5 100644 --- a/app/lib/features/web_feed/presentation/widgets/tags_horizontal_list.dart +++ b/app/lib/features/web_feed/presentation/widgets/tags_horizontal_list.dart @@ -25,7 +25,7 @@ import 'package:weblibre/features/web_feed/data/models/feed_category.dart'; class TagsHorizontalList extends StatelessWidget { late final List _tags; - TagsHorizontalList({ + TagsHorizontalList({super.key, required List tags, Set selectedTags = const {}, void Function(String tagId, bool value)? onTagSelected, diff --git a/app/lib/presentation/widgets/qr_scanner_button.dart b/app/lib/presentation/widgets/qr_scanner_button.dart index 50b0da47..baa0dc15 100644 --- a/app/lib/presentation/widgets/qr_scanner_button.dart +++ b/app/lib/presentation/widgets/qr_scanner_button.dart @@ -26,7 +26,7 @@ import 'package:weblibre/features/qr_scanner/presentation/dialogs/qr_scanner_dia class QrScannerButton extends HookConsumerWidget { final void Function(Barcode? scanResult) onScanResult; - const QrScannerButton({required this.onScanResult}); + const QrScannerButton({super.key, required this.onScanResult}); @override Widget build(BuildContext context, WidgetRef ref) { @@ -35,7 +35,7 @@ class QrScannerButton extends HookConsumerWidget { final result = await showDialog( context: context, builder: (context) { - return QrScannerDialog(); + return const QrScannerDialog(); }, ); diff --git a/packages/flutter_mozilla_components/example/pubspec.yaml b/packages/flutter_mozilla_components/example/pubspec.yaml index 557cd6b0..c3699c36 100644 --- a/packages/flutter_mozilla_components/example/pubspec.yaml +++ b/packages/flutter_mozilla_components/example/pubspec.yaml @@ -16,10 +16,10 @@ dependencies: path: ../ dev_dependencies: - integration_test: - sdk: flutter flutter_test: sdk: flutter + integration_test: + sdk: flutter lint: ^2.8.0 flutter: diff --git a/packages/flutter_mozilla_components/example/test/widget_test.dart b/packages/flutter_mozilla_components/example/test/widget_test.dart index 1f2b774a..85501dd0 100644 --- a/packages/flutter_mozilla_components/example/test/widget_test.dart +++ b/packages/flutter_mozilla_components/example/test/widget_test.dart @@ -6,9 +6,8 @@ // tree, read text, and verify that the values of widget properties are correct. import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; - import 'package:flutter_mozilla_components_example/main.dart'; +import 'package:flutter_test/flutter_test.dart'; void main() { testWidgets('Verify Platform version', (WidgetTester tester) async { diff --git a/packages/flutter_tor/example/pubspec.yaml b/packages/flutter_tor/example/pubspec.yaml index a5ec7096..2375a179 100644 --- a/packages/flutter_tor/example/pubspec.yaml +++ b/packages/flutter_tor/example/pubspec.yaml @@ -27,11 +27,11 @@ dependencies: socks5_proxy: ^2.1.1 dev_dependencies: - lint: ^2.8.0 flutter_test: sdk: flutter integration_test: sdk: flutter + lint: ^2.8.0 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec diff --git a/packages/flutter_tor/lib/flutter_tor.dart b/packages/flutter_tor/lib/flutter_tor.dart index e79a9219..756b1b1e 100644 --- a/packages/flutter_tor/lib/flutter_tor.dart +++ b/packages/flutter_tor/lib/flutter_tor.dart @@ -1,9 +1,8 @@ +export 'src/flutter_tor.dart'; export 'src/tor_api.g.dart' show - TransportType, + IPtProxyController, TorConfiguration, - TorStatus, TorLogMessage, - IPtProxyController; - -export 'src/flutter_tor.dart'; + TorStatus, + TransportType; diff --git a/packages/flutter_tor/lib/src/flutter_tor.dart b/packages/flutter_tor/lib/src/flutter_tor.dart index ef3993d1..8621b382 100644 --- a/packages/flutter_tor/lib/src/flutter_tor.dart +++ b/packages/flutter_tor/lib/src/flutter_tor.dart @@ -57,9 +57,9 @@ class FlutterTor { // Unregister the Flutter API handler TorLogApi.setUp(null); - _logController.close(); - _statusController.close(); - _bootstrapController.close(); + unawaited(_logController.close()); + unawaited(_statusController.close()); + unawaited(_bootstrapController.close()); } } diff --git a/packages/locale_resolver/example/pubspec.yaml b/packages/locale_resolver/example/pubspec.yaml index c2c0cc9a..219c0a9d 100644 --- a/packages/locale_resolver/example/pubspec.yaml +++ b/packages/locale_resolver/example/pubspec.yaml @@ -26,15 +26,11 @@ dependencies: # the parent directory to use the current plugin's version. path: ../ - # The following adds the Cupertino Icons font to your application. - # Use with the CupertinoIcons class for iOS style icons. - cupertino_icons: ^1.0.8 - dev_dependencies: - integration_test: - sdk: flutter flutter_test: sdk: flutter + integration_test: + sdk: flutter # The "flutter_lints" package below contains a set of recommended lints to # encourage good coding practices. The lint set provided by the package is diff --git a/packages/simple_intent_receiver/example/lib/main.dart b/packages/simple_intent_receiver/example/lib/main.dart index fb3870b0..99e81cf2 100644 --- a/packages/simple_intent_receiver/example/lib/main.dart +++ b/packages/simple_intent_receiver/example/lib/main.dart @@ -42,6 +42,6 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { - return MaterialApp(); + return const MaterialApp(); } } diff --git a/packages/simple_intent_receiver/example/pubspec.yaml b/packages/simple_intent_receiver/example/pubspec.yaml index 25598efb..2c7e6259 100644 --- a/packages/simple_intent_receiver/example/pubspec.yaml +++ b/packages/simple_intent_receiver/example/pubspec.yaml @@ -17,7 +17,7 @@ environment: dependencies: flutter: sdk: flutter - + logger: ^2.6.2 simple_intent_receiver: # When depending on this package from a real application you should use: # simple_intent_receiver: ^x.y.z @@ -26,16 +26,11 @@ dependencies: # the parent directory to use the current plugin's version. path: ../ - # The following adds the Cupertino Icons font to your application. - # Use with the CupertinoIcons class for iOS style icons. - cupertino_icons: ^1.0.8 - logger: ^2.6.2 - dev_dependencies: - integration_test: - sdk: flutter flutter_test: sdk: flutter + integration_test: + sdk: flutter # The "flutter_lints" package below contains a set of recommended lints to # encourage good coding practices. The lint set provided by the package is diff --git a/packages/speech_to_text_dialog/example/lib/main.dart b/packages/speech_to_text_dialog/example/lib/main.dart index 7ec33c3f..6aa4fb13 100644 --- a/packages/speech_to_text_dialog/example/lib/main.dart +++ b/packages/speech_to_text_dialog/example/lib/main.dart @@ -1,6 +1,6 @@ -import 'package:flutter/material.dart'; import 'dart:async'; +import 'package:flutter/material.dart'; import 'package:speech_to_text_dialog/speech_to_text_dialog.dart'; void main() { @@ -50,7 +50,7 @@ class _MyAppState extends State { @override void dispose() { - _textSubscription?.cancel(); + unawaited(_textSubscription?.cancel()); _speechToTextDialog.dispose(); super.dispose(); } diff --git a/packages/speech_to_text_dialog/example/pubspec.yaml b/packages/speech_to_text_dialog/example/pubspec.yaml index 2b85770c..a601bc98 100644 --- a/packages/speech_to_text_dialog/example/pubspec.yaml +++ b/packages/speech_to_text_dialog/example/pubspec.yaml @@ -26,15 +26,11 @@ dependencies: # the parent directory to use the current plugin's version. path: ../ - # The following adds the Cupertino Icons font to your application. - # Use with the CupertinoIcons class for iOS style icons. - cupertino_icons: ^1.0.8 - dev_dependencies: - integration_test: - sdk: flutter flutter_test: sdk: flutter + integration_test: + sdk: flutter # The "flutter_lints" package below contains a set of recommended lints to # encourage good coding practices. The lint set provided by the package is diff --git a/packages/speech_to_text_dialog/lib/speech_to_text_dialog.dart b/packages/speech_to_text_dialog/lib/speech_to_text_dialog.dart index dce3ec7c..681a316a 100644 --- a/packages/speech_to_text_dialog/lib/speech_to_text_dialog.dart +++ b/packages/speech_to_text_dialog/lib/speech_to_text_dialog.dart @@ -20,7 +20,7 @@ import 'dart:async'; import 'package:flutter/services.dart' show BinaryMessenger; -import 'src/pigeons/speech_to_text.g.dart'; +import 'package:speech_to_text_dialog/src/pigeons/speech_to_text.g.dart'; /// Speech recognition dialog using Android's RecognizerIntent. /// @@ -82,7 +82,7 @@ class SpeechToTextDialog implements SpeechToTextEvents { /// print('Speech recognition not available'); /// } /// ``` - Future showDialog({String? locale}) async { + Future showDialog({String? locale}) { return _api.showDialog(locale: locale); } @@ -101,7 +101,7 @@ class SpeechToTextDialog implements SpeechToTextEvents { if (!_disposed) { _disposed = true; SpeechToTextEvents.setUp(null, binaryMessenger: _binaryMessenger); - _textStreamController.close(); + unawaited(_textStreamController.close()); } } }