From 79814363744740a76dad1025b6545180973f7d47 Mon Sep 17 00:00:00 2001 From: Flummi Date: Wed, 11 Jun 2025 20:45:37 +0200 Subject: [PATCH] v1.1.21+51 --- lib/providers/theme_provider.dart | 8 +- lib/screens/detailview_screen.dart | 230 +++++++++++++++-------------- lib/screens/fullscreen_screen.dart | 2 +- pubspec.yaml | 2 +- 4 files changed, 126 insertions(+), 116 deletions(-) diff --git a/lib/providers/theme_provider.dart b/lib/providers/theme_provider.dart index 46f6a60..c7311c1 100644 --- a/lib/providers/theme_provider.dart +++ b/lib/providers/theme_provider.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; @@ -232,10 +233,11 @@ final ThemeData f0ck95Theme = ThemeData( onPrimary: Colors.black, onSecondary: Colors.white, ), - appBarTheme: const AppBarTheme( - backgroundColor: Color(0xFFC0C0C0), + appBarTheme: AppBarTheme( + backgroundColor: const Color(0xFFE0E0E0), foregroundColor: Colors.black, - elevation: 2, + elevation: 4, + centerTitle: true ), textTheme: const TextTheme( bodyLarge: TextStyle(color: Colors.black), diff --git a/lib/screens/detailview_screen.dart b/lib/screens/detailview_screen.dart index bf53fda..3e47ce1 100644 --- a/lib/screens/detailview_screen.dart +++ b/lib/screens/detailview_screen.dart @@ -105,9 +105,7 @@ class _DetailViewState extends ConsumerState { if (itemIndex == -1) { Future.microtask(() { - ref - .read(mediaProvider.notifier) - .loadMedia(/*id: widget.initialItemId + 50*/); + ref.read(mediaProvider.notifier).loadMedia(id: widget.initialItemId + 50); }); return Scaffold( appBar: AppBar(), @@ -125,113 +123,7 @@ class _DetailViewState extends ConsumerState { } return Scaffold( - appBar: AppBar( - centerTitle: true, - title: Text('f0ck #${mediaState.mediaItems[_currentIndex].id}'), - automaticallyImplyLeading: false, - leading: IconButton( - icon: const Icon(Icons.arrow_back), - onPressed: () { - context.canPop() ? context.pop() : context.go('/', extra: true); - }, - ), - actions: [ - IconButton( - icon: const Icon(Icons.fullscreen), - onPressed: () { - final mediaState = ref.read(mediaProvider); - final currentItem = mediaState.mediaItems[_currentIndex]; - Navigator.of(context).push( - MaterialPageRoute( - builder: (_) => FullScreenMediaView(item: currentItem), - ), - ); - }, - ), - IconButton( - icon: const Icon(Icons.download), - onPressed: _downloadMedia, - ), - PopupMenuButton( - onSelected: (value) async { - final item = mediaState.mediaItems[_currentIndex]; - switch (value) { - case 'media': - File file = await DefaultCacheManager().getSingleFile( - item.mediaUrl, - ); - Uint8List bytes = await file.readAsBytes(); - final params = ShareParams( - files: [XFile.fromData(bytes, mimeType: item.mime)], - ); - await SharePlus.instance.share(params); - break; - case 'direct_link': - await SharePlus.instance.share( - ShareParams(text: item.mediaUrl), - ); - break; - case 'post_link': - await SharePlus.instance.share( - ShareParams(text: item.postUrl), - ); - break; - } - }, - itemBuilder: (context) => [ - PopupMenuItem( - value: 'media', - child: ListTile( - leading: const Icon(Icons.image), - title: const Text('Als Datei'), - ), - ), - PopupMenuItem( - value: 'direct_link', - child: ListTile( - leading: const Icon(Icons.link), - title: const Text('Link zur Datei'), - ), - ), - PopupMenuItem( - value: 'post_link', - child: ListTile( - leading: const Icon(Icons.article), - title: const Text('Link zum f0ck'), - ), - ), - ], - icon: const Icon(Icons.share), - ), - Builder( - builder: (context) { - return IconButton( - icon: const Icon(Icons.menu), - onPressed: () { - Scaffold.of(context).openEndDrawer(); - }, - ); - }, - ), - ], - ), endDrawer: EndDrawer(ref: ref), - body: Stack( - children: [ - PageTransformer( - controller: _pageController!, - pages: mediaState.mediaItems.map((item) { - int itemIndex = mediaState.mediaItems.indexOf(item); - return SafeArea( - child: SmartRefreshIndicator( - onRefresh: _loadMoreMedia, - child: _buildMediaItem(item, _currentIndex == itemIndex), - ), - ); - }).toList(), - ), - ], - ), persistentFooterButtons: mediaState.tag != null ? [ Center( @@ -245,6 +137,120 @@ class _DetailViewState extends ConsumerState { ), ] : null, + body: CustomScrollView( + slivers: [ + SliverAppBar( + floating: true, + pinned: true, + snap: true, + centerTitle: true, + title: Text('f0ck #${mediaState.mediaItems[_currentIndex].id}'), + leading: IconButton( + icon: const Icon(Icons.arrow_back), + onPressed: () { + context.canPop() ? context.pop() : context.go('/', extra: true); + }, + ), + actions: [ + IconButton( + icon: const Icon(Icons.fullscreen), + onPressed: () { + final currentItem = mediaState.mediaItems[_currentIndex]; + Navigator.of(context).push( + MaterialPageRoute( + builder: (_) => FullScreenMediaView(item: currentItem), + ), + ); + }, + ), + IconButton( + icon: const Icon(Icons.download), + onPressed: _downloadMedia, + ), + PopupMenuButton( + onSelected: (value) async { + final item = mediaState.mediaItems[_currentIndex]; + switch (value) { + case 'media': + File file = await DefaultCacheManager().getSingleFile( + item.mediaUrl, + ); + Uint8List bytes = await file.readAsBytes(); + final params = ShareParams( + files: [XFile.fromData(bytes, mimeType: item.mime)], + ); + await SharePlus.instance.share(params); + break; + case 'direct_link': + await SharePlus.instance.share( + ShareParams(text: item.mediaUrl), + ); + break; + case 'post_link': + await SharePlus.instance.share( + ShareParams(text: item.postUrl), + ); + break; + } + }, + itemBuilder: (context) => [ + PopupMenuItem( + value: 'media', + child: ListTile( + leading: const Icon(Icons.image), + title: const Text('Als Datei'), + ), + ), + PopupMenuItem( + value: 'direct_link', + child: ListTile( + leading: const Icon(Icons.link), + title: const Text('Link zur Datei'), + ), + ), + PopupMenuItem( + value: 'post_link', + child: ListTile( + leading: const Icon(Icons.article), + title: const Text('Link zum f0ck'), + ), + ), + ], + icon: const Icon(Icons.share), + ), + Builder( + builder: (context) => IconButton( + icon: const Icon(Icons.menu), + onPressed: () { + Scaffold.of(context).openEndDrawer(); + }, + ), + ), + ], + flexibleSpace: FlexibleSpaceBar( + background: Container(color: Colors.transparent), + ), + ), + SliverPadding( + padding: EdgeInsets.zero, + sliver: SliverFillRemaining( + child: PageTransformer( + controller: _pageController!, + pages: mediaState.mediaItems.map((item) { + int pageIndex = mediaState.mediaItems.indexOf(item); + return SafeArea( + top: false, + child: SmartRefreshIndicator( + onRefresh: _loadMoreMedia, + child: _buildMediaItem(item, _currentIndex == pageIndex), + ), + ); + }).toList(), + ), + ), + ), + ], + ), ); } @@ -258,8 +264,10 @@ class _DetailViewState extends ConsumerState { CachedNetworkImage( imageUrl: item.mediaUrl, fit: BoxFit.contain, - placeholder: (context, url) => const CircularProgressIndicator(), - errorWidget: (context, url, error) => const Icon(Icons.error), + placeholder: (context, url) => + const Center(child: CircularProgressIndicator()), + errorWidget: (context, url, error) => + const Center(child: Icon(Icons.error)), ) else VideoWidget(details: item, isActive: isActive), diff --git a/lib/screens/fullscreen_screen.dart b/lib/screens/fullscreen_screen.dart index 9eebe76..93c8ab3 100644 --- a/lib/screens/fullscreen_screen.dart +++ b/lib/screens/fullscreen_screen.dart @@ -62,7 +62,7 @@ class _FullScreenMediaViewState extends State { child: Align( alignment: Alignment.topLeft, child: IconButton( - icon: const Icon(Icons.arrow_back), + icon: const Icon(Icons.arrow_back, color: Colors.white), onPressed: () => Navigator.of(context).pop(), ), ), diff --git a/pubspec.yaml b/pubspec.yaml index 1d6e1d4..b0ea978 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.1.20+50 +version: 1.1.21+51 environment: sdk: ^3.9.0-100.2.beta