diff --git a/lib/providers/MediaProvider.dart b/lib/providers/MediaProvider.dart index f23d307..1cfab97 100644 --- a/lib/providers/MediaProvider.dart +++ b/lib/providers/MediaProvider.dart @@ -22,25 +22,26 @@ class MediaProvider extends ChangeNotifier { int get crossAxisCount => _crossAxisCount; List get mediaItems => _mediaItems; bool get isLoading => _isLoading; + Function get resetMedia => _resetMedia; void setType(String type) { _typeid = types.indexOf(type); - loadMedia(reload: true); + _resetMedia(); } void setMode(int mode) { _mode = mode; - loadMedia(reload: true); + _resetMedia(); } void toggleRandom() { _random = !_random; - loadMedia(reload: true); + _resetMedia(); } void setTag(String? tag) { _tag = tag; - loadMedia(reload: true); + _resetMedia(); } void setCrossAxisCount(int crossAxisCount) { @@ -50,7 +51,8 @@ class MediaProvider extends ChangeNotifier { void setMediaItems(List mediaItems) { if (_mediaItems != mediaItems) { - _mediaItems = mediaItems; + _mediaItems.clear(); + _mediaItems.addAll(mediaItems); notifyListeners(); } } @@ -60,25 +62,27 @@ class MediaProvider extends ChangeNotifier { notifyListeners(); } - Future loadMedia({bool reload = false, bool notify = true}) async { + void _resetMedia() { + _mediaItems.clear(); + notifyListeners(); + loadMedia(); + } + + Future loadMedia({bool notify = true}) async { if (_isLoading) return; _isLoading = true; if (notify) notifyListeners(); try { final newMedia = await fetchMedia( - older: reload - ? null - : _mediaItems.isNotEmpty - ? _mediaItems.last.id - : null, + older: _mediaItems.isNotEmpty ? _mediaItems.last.id : null, type: type, mode: mode, random: random, tag: tag, ); - reload ? setMediaItems(newMedia) : addMediaItems(newMedia); + addMediaItems(newMedia); } catch (e) { debugPrint('Fehler beim Laden der Medien: $e'); } finally { diff --git a/lib/screens/DetailView.dart b/lib/screens/DetailView.dart index 1e08c44..9db5982 100644 --- a/lib/screens/DetailView.dart +++ b/lib/screens/DetailView.dart @@ -31,14 +31,12 @@ class _DetailViewState extends State { final initialIndex = provider.mediaItems.indexWhere( (item) => item.id == widget.initialItemId, ); - + _pageController = PageController(initialPage: initialIndex); _currentIndex = initialIndex; _pageController.addListener(() { - setState(() { - _currentIndex = _pageController.page?.round() ?? 0; - }); + setState(() => _currentIndex = _pageController.page?.round() ?? 0); }); _preloadAdjacentMedia(initialIndex); @@ -97,10 +95,7 @@ class _DetailViewState extends State { final provider = Provider.of(context); return Scaffold( - appBar: AppBar( - centerTitle: true, - title: Text('f0ck #${provider.mediaItems.elementAt(_currentIndex).id.toString()} (${provider.type})'), - ), + appBar: AppBar(centerTitle: true, title: const Text('f0ck')), body: Stack( children: [ PageTransformer( @@ -157,7 +152,7 @@ class _DetailViewState extends State { VideoWidget(details: item, isActive: isActive), const SizedBox(height: 20), Text( - item.mime, + 'f0ck #${item.id.toString()}', style: const TextStyle(color: Colors.white, fontSize: 18), ), const SizedBox(height: 10, width: double.infinity), @@ -170,7 +165,7 @@ class _DetailViewState extends State { if (tag.tag == 'sfw' || tag.tag == 'nsfw') return; setState(() { provider.setTag(tag.tag); - Navigator.pop(context); + Navigator.pop(context, true); }); }, label: Text(tag.tag), diff --git a/lib/screens/MediaGrid.dart b/lib/screens/MediaGrid.dart index 759451a..39cee09 100644 --- a/lib/screens/MediaGrid.dart +++ b/lib/screens/MediaGrid.dart @@ -33,6 +33,10 @@ class _MediaGridState extends State { }); } + void scrollToTop() { + _scrollController.jumpTo(0); + } + @override Widget build(BuildContext context) { final provider = Provider.of(context); @@ -48,7 +52,10 @@ class _MediaGridState extends State { icon: Icon( provider.random ? Icons.shuffle_on_outlined : Icons.shuffle, ), - onPressed: () => provider.toggleRandom(), + onPressed: () { + provider.toggleRandom(); + _scrollController.jumpTo(0); + }, ), IconButton( icon: const Icon(Icons.menu), @@ -78,6 +85,7 @@ class _MediaGridState extends State { onChanged: (String? newValue) { if (newValue != null) { provider.setType(newValue); + _scrollController.jumpTo(0); } }, ), @@ -96,6 +104,7 @@ class _MediaGridState extends State { onChanged: (String? newValue) { if (newValue != null) { provider.setMode(provider.modes.indexOf(newValue)); + _scrollController.jumpTo(0); } }, ), @@ -125,6 +134,7 @@ class _MediaGridState extends State { labelStyle: const TextStyle(color: Colors.white), onDeleted: () { provider.setTag(null); + _scrollController.jumpTo(0); }, ), ], @@ -133,7 +143,8 @@ class _MediaGridState extends State { : null, body: RefreshIndicator( onRefresh: () async { - await provider.loadMedia(reload: true); + await provider.resetMedia(); + _scrollController.jumpTo(0); }, child: Consumer( builder: (context, mediaProvider, child) { @@ -158,12 +169,17 @@ class _MediaGridState extends State { final item = provider.mediaItems[index]; return InkWell( - onTap: () => Navigator.push( - context, - MaterialPageRoute( - builder: (context) => DetailView(initialItemId: item.id), - ), - ), + onTap: () async { + bool test = await Navigator.push( + context, + MaterialPageRoute( + builder: (context) => DetailView(initialItemId: item.id), + ), + ); + if (test) { + scrollToTop(); + } + }, child: Stack( fit: StackFit.expand, children: [ diff --git a/pubspec.yaml b/pubspec.yaml index fccc8b2..9e46b5f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. -version: 1.0.28+28 +version: 1.0.29+29 environment: sdk: ^3.9.0-100.2.beta