···11-import 'dart:io';
22-import 'dart:typed_data';
33-44-/// Interface defining cache management operations
55-abstract class CacheManagerInterface {
66- /// Get a cached file or download it if not available
77- Future<File> getFile(String url);
88-99- /// Get a cached file
1010- /// Returns null if not found
1111- Future<File?> getCachedFile(String url);
1212-1313- /// Store a file in the cache with the given key
1414- Future<void> putFile(String url, Uint8List fileBytes);
1515-1616- /// Remove a specific file from cache
1717- Future<void> removeFile(String url);
1818-1919- /// Calculate the total size of the cache in bytes
2020- Future<int> getCacheSize();
2121-2222- /// Clear all cached files
2323- Future<void> clearCache();
2424-}
···1010import 'package:sparksocial/src/core/network/atproto/data/models/labeler_models.dart';
1111import 'package:sparksocial/src/core/network/atproto/data/repositories/feed_repository.dart';
1212import 'package:sparksocial/src/core/network/atproto/data/repositories/sprk_repository.dart';
1313-import 'package:sparksocial/src/core/storage/cache/cache_manager_interface.dart';
1413import 'package:sparksocial/src/core/storage/cache/download_manager_interface.dart';
1514import 'package:sparksocial/src/core/storage/cache/sql_cache_interface.dart';
1615import 'package:sparksocial/src/core/storage/preferences/settings_repository.dart';
···3433 late final SparkLogger _logger;
3534 late final DownloadManagerInterface _downloadManager;
3635 late final SettingsRepository _settingsRepository;
3737- late final CacheManagerInterface _cacheManager;
38363937 // Add a flag to track if this notifier has been built before
4038 bool _hasBeenBuilt = false;
···5048 _settingsRepository = GetIt.instance<SettingsRepository>();
5149 _sqlCache = GetIt.instance<SQLCacheInterface>();
5250 _downloadManager = GetIt.instance<DownloadManagerInterface>();
5353- _cacheManager = GetIt.instance<CacheManagerInterface>();
5451 _logger = GetIt.instance<LogService>().getLogger('FeedNotifier ${feed.identifier}');
5552 } else {
5653 _logger.d('Build called again for ${feed.identifier}, hasBeenBuilt: $_hasBeenBuilt');
···471468472469 // Ensure media files are cached; if missing, enqueue a download task.
473470 if (post.embed is EmbedViewVideo) {
474474- final cachedFile = await _cacheManager.getCachedFile(post.videoUrl);
475475- if (cachedFile == null) {
476476- _downloadManager.submitTask(
477477- DownloadTask(
478478- uri: post.uri,
479479- post: post,
480480- feed: _feed,
481481- onComplete: (task) => _logger.d('Re-cached media for \\${task.uri}'),
482482- onError: (task, e, s) => _logger.e('Failed to re-cache media for \\${task.uri}: \\$e'),
483483- ),
484484- );
485485- }
471471+ _downloadManager.submitTask(
472472+ DownloadTask(
473473+ uri: post.uri,
474474+ post: post,
475475+ feed: _feed,
476476+ onComplete: (task) => _logger.d('Re-cached media for \\${task.uri}'),
477477+ onError: (task, e, s) => _logger.e('Failed to re-cache media for \\${task.uri}: \\$e'),
478478+ ),
479479+ );
486480 }
487481 }
488482
+1
lib/src/features/feed/ui/pages/feed_page.dart
···111111 scrollDirection: Axis.vertical,
112112 restorationId: widget.feed.identifier,
113113 physics: shouldBeActive ? const PageScrollPhysics() : const NeverScrollableScrollPhysics(),
114114+ allowImplicitScrolling: true,
114115 onPageChanged: (index) {
115116 // Only handle page changes when active
116117 if (shouldBeActive) {