- preload adjacent media
This commit is contained in:
		@@ -5,6 +5,7 @@ import 'package:f0ckapp/services/Api.dart';
 | 
			
		||||
import 'package:f0ckapp/widgets/VideoWidget.dart';
 | 
			
		||||
import 'package:f0ckapp/utils/SmartRefreshIndicator.dart';
 | 
			
		||||
import 'package:f0ckapp/utils/PageTransformer.dart';
 | 
			
		||||
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
 | 
			
		||||
 | 
			
		||||
class DetailView extends StatefulWidget {
 | 
			
		||||
  final int initialItemId;
 | 
			
		||||
@@ -46,18 +47,42 @@ class _DetailViewState extends State<DetailView> {
 | 
			
		||||
    _pageController = PageController(initialPage: initialIndex);
 | 
			
		||||
    currentItemId = mediaItems[initialIndex].id;
 | 
			
		||||
 | 
			
		||||
    _pageController.addListener(_onPageScroll);
 | 
			
		||||
    int? lastLoadedIndex;
 | 
			
		||||
    _pageController.addListener(() async {
 | 
			
		||||
      final newIndex = _pageController.page?.round();
 | 
			
		||||
      if (newIndex != null &&
 | 
			
		||||
          newIndex < mediaItems.length &&
 | 
			
		||||
          newIndex != lastLoadedIndex) {
 | 
			
		||||
        setState(() => currentItemId = mediaItems[newIndex].id);
 | 
			
		||||
        lastLoadedIndex = newIndex;
 | 
			
		||||
 | 
			
		||||
        _preloadAdjacentMedia(newIndex);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (_pageController.position.pixels >=
 | 
			
		||||
          _pageController.position.maxScrollExtent - 100) {
 | 
			
		||||
        _loadMoreMedia();
 | 
			
		||||
      }
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    _preloadAdjacentMedia(initialIndex);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void _onPageScroll() {
 | 
			
		||||
    final newIndex = _pageController.page?.round();
 | 
			
		||||
    if (newIndex != null && newIndex < mediaItems.length) {
 | 
			
		||||
      setState(() => currentItemId = mediaItems[newIndex].id);
 | 
			
		||||
  void _preloadAdjacentMedia(int index) async {
 | 
			
		||||
    if (index + 1 < mediaItems.length) {
 | 
			
		||||
      final nextUrl = mediaItems[index + 1].mediaUrl;
 | 
			
		||||
      if (await DefaultCacheManager().getFileFromCache(nextUrl) == null) {
 | 
			
		||||
        await DefaultCacheManager().downloadFile(nextUrl);
 | 
			
		||||
        print('preload ${mediaItems[index + 1].id}');
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (_pageController.position.pixels >=
 | 
			
		||||
        _pageController.position.maxScrollExtent - 100) {
 | 
			
		||||
      _loadMoreMedia();
 | 
			
		||||
    if (index - 1 >= 0) {
 | 
			
		||||
      final prevUrl = mediaItems[index - 1].mediaUrl;
 | 
			
		||||
      if (await DefaultCacheManager().getFileFromCache(prevUrl) == null) {
 | 
			
		||||
        await DefaultCacheManager().downloadFile(prevUrl);
 | 
			
		||||
        print('preload ${mediaItems[index - 1].id}');
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -120,11 +145,12 @@ class _DetailViewState extends State<DetailView> {
 | 
			
		||||
          PageTransformer(
 | 
			
		||||
            controller: _pageController,
 | 
			
		||||
            pages: mediaItems.map((item) {
 | 
			
		||||
              final isActive = item.id == currentItemId;
 | 
			
		||||
              return Scaffold(
 | 
			
		||||
                body: SafeArea(
 | 
			
		||||
                  child: SmartRefreshIndicator(
 | 
			
		||||
                    onRefresh: _refreshMediaItem,
 | 
			
		||||
                    child: _buildMediaItem(item),
 | 
			
		||||
                    child: _buildMediaItem(item, isActive),
 | 
			
		||||
                  ),
 | 
			
		||||
                ),
 | 
			
		||||
              );
 | 
			
		||||
@@ -169,7 +195,7 @@ class _DetailViewState extends State<DetailView> {
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  Widget _buildMediaItem(MediaItem item) {
 | 
			
		||||
  Widget _buildMediaItem(MediaItem item, bool isActive) {
 | 
			
		||||
    return SingleChildScrollView(
 | 
			
		||||
      child: Column(
 | 
			
		||||
        mainAxisAlignment: MainAxisAlignment.center,
 | 
			
		||||
@@ -182,7 +208,7 @@ class _DetailViewState extends State<DetailView> {
 | 
			
		||||
              errorWidget: (context, url, error) => Icon(Icons.error),
 | 
			
		||||
            )
 | 
			
		||||
          else
 | 
			
		||||
            VideoWidget(details: item),
 | 
			
		||||
            VideoWidget(details: item, isActive: isActive),
 | 
			
		||||
          const SizedBox(height: 20),
 | 
			
		||||
          Text(
 | 
			
		||||
            item.mime,
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,7 @@ class MediaGrid extends StatefulWidget {
 | 
			
		||||
 | 
			
		||||
class _MediaGridState extends State<MediaGrid> {
 | 
			
		||||
  final ScrollController _scrollController = ScrollController();
 | 
			
		||||
  final String _version = '1.0.24+24';
 | 
			
		||||
  final String _version = '1.0.25+25';
 | 
			
		||||
  List<MediaItem> mediaItems = [];
 | 
			
		||||
  bool isLoading = false;
 | 
			
		||||
  Timer? _debounceTimer;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user