diff --git a/app/lib/extensions/ref_cache.dart b/app/lib/extensions/ref_cache.dart new file mode 100644 index 00000000..ee9b877c --- /dev/null +++ b/app/lib/extensions/ref_cache.dart @@ -0,0 +1,17 @@ +import 'dart:async'; + +import 'package:riverpod/riverpod.dart'; + +extension CacheForExtension on Ref { + /// Keeps the provider alive for [duration]. + void cacheFor(Duration duration) { + // Immediately prevent the state from getting destroyed. + final link = keepAlive(); + // After duration has elapsed, we re-enable automatic disposal. + final timer = Timer(duration, link.close); + + // Optional: when the provider is recomputed (such as with ref.watch), + // we cancel the pending timer. + onDispose(timer.cancel); + } +} diff --git a/app/lib/features/bangs/data/services/data_source.dart b/app/lib/features/bangs/data/services/data_source.dart index 7c173aa8..a931ef72 100644 --- a/app/lib/features/bangs/data/services/data_source.dart +++ b/app/lib/features/bangs/data/services/data_source.dart @@ -11,7 +11,7 @@ import 'package:weblibre/features/bangs/data/models/bang_group.dart'; part 'data_source.g.dart'; -@Riverpod() +@Riverpod(keepAlive: true) class BangDataSourceService extends _$BangDataSourceService { @override void build() {} diff --git a/app/lib/features/bangs/data/services/data_source.g.dart b/app/lib/features/bangs/data/services/data_source.g.dart index ed79789c..9c9efabb 100644 --- a/app/lib/features/bangs/data/services/data_source.g.dart +++ b/app/lib/features/bangs/data/services/data_source.g.dart @@ -7,12 +7,12 @@ part of 'data_source.dart'; // ************************************************************************** String _$bangDataSourceServiceHash() => - r'bd44bb2bcc76a836fc804e75da2c0d7f0e638ab8'; + r'2ff811ece417ae498dacc04a2fa963cffb34c8a9'; /// See also [BangDataSourceService]. @ProviderFor(BangDataSourceService) final bangDataSourceServiceProvider = - AutoDisposeNotifierProvider.internal( + NotifierProvider.internal( BangDataSourceService.new, name: r'bangDataSourceServiceProvider', debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') @@ -22,6 +22,6 @@ final bangDataSourceServiceProvider = allTransitiveDependencies: null, ); -typedef _$BangDataSourceService = AutoDisposeNotifier; +typedef _$BangDataSourceService = Notifier; // ignore_for_file: type=lint // ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package diff --git a/app/lib/presentation/controllers/website_title.dart b/app/lib/presentation/controllers/website_title.dart index bf8b5eee..48526963 100644 --- a/app/lib/presentation/controllers/website_title.dart +++ b/app/lib/presentation/controllers/website_title.dart @@ -4,6 +4,7 @@ import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:weblibre/core/logger.dart'; import 'package:weblibre/data/models/web_page_info.dart'; import 'package:weblibre/domain/services/generic_website.dart'; +import 'package:weblibre/extensions/ref_cache.dart'; import 'package:weblibre/features/geckoview/domain/providers/selected_tab.dart'; import 'package:weblibre/features/geckoview/features/tabs/domain/repositories/container.dart'; import 'package:weblibre/features/geckoview/features/tabs/domain/repositories/tab.dart'; @@ -17,6 +18,8 @@ const _supportedFetchSchemes = {'http', 'https'}; class CompletePageInfo extends _$CompletePageInfo { @override AsyncValue build(Uri url, WebPageInfo? cached) { + ref.cacheFor(const Duration(minutes: 2)); + if (cached?.isPageInfoComplete == true || !_supportedFetchSchemes.contains(url.scheme)) { return AsyncData(cached!); @@ -91,7 +94,7 @@ Future pageInfo( ); if (result.isSuccess) { - ref.keepAlive(); + ref.cacheFor(const Duration(minutes: 2)); } return result.value; diff --git a/app/lib/presentation/controllers/website_title.g.dart b/app/lib/presentation/controllers/website_title.g.dart index 069dcf74..6654d17e 100644 --- a/app/lib/presentation/controllers/website_title.g.dart +++ b/app/lib/presentation/controllers/website_title.g.dart @@ -6,7 +6,7 @@ part of 'website_title.dart'; // RiverpodGenerator // ************************************************************************** -String _$pageInfoHash() => r'32527f7803e3eb33f74ce58d0773a9386df2546d'; +String _$pageInfoHash() => r'a57b4b72b16b63f5f366e014bb56cd0f021bcfa8'; /// Copied from Dart SDK class _SystemHash { @@ -157,7 +157,7 @@ class _PageInfoProviderElement bool get isImageRequest => (origin as PageInfoProvider).isImageRequest; } -String _$completePageInfoHash() => r'6a258150d2bb72b8f21de973ddcd23734f79ace0'; +String _$completePageInfoHash() => r'51474d7b110cfac44dd64e9f71fde091c5a35d4e'; abstract class _$CompletePageInfo extends BuildlessAutoDisposeNotifier> {