v1.2.0+54
All checks were successful
Flutter Schmutter / build (push) Successful in 3m37s

- screaming_possum.gif
This commit is contained in:
2025-06-13 13:55:05 +02:00
parent dff9cda829
commit 9655f15927
18 changed files with 628 additions and 878 deletions

View File

@ -1,14 +1,13 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:get/get.dart';
import 'package:f0ckapp/providers/theme_provider.dart';
//import 'package:f0ckapp/services/api_service.dart';
import 'package:f0ckapp/utils/appversion_util.dart';
class EndDrawer extends StatelessWidget {
final WidgetRef ref;
const EndDrawer({super.key, required this.ref});
const EndDrawer({super.key});
void _showMsg(String message, BuildContext context) {
ScaffoldMessenger.of(context)
@ -18,6 +17,9 @@ class EndDrawer extends StatelessWidget {
@override
Widget build(BuildContext context) {
//final ApiService c = Get.find<ApiService>();
final ThemeController themeController = Get.find();
return Drawer(
child: ListView(
padding: EdgeInsets.zero,
@ -88,34 +90,32 @@ class EndDrawer extends StatelessWidget {
children: [
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: Column(
children: themeMap.entries.map((entry) {
final String themeName = entry.key;
final ThemeData themeData = entry.value;
final ThemeData currentTheme = ref.watch(
themeNotifierProvider,
);
final bool isSelected = currentTheme == themeData;
return ListTile(
title: Text(themeName),
selected: isSelected,
selectedTileColor: Colors.blue.withValues(alpha: 0.2),
onTap: () async {
await ref
.read(themeNotifierProvider.notifier)
.updateTheme(themeName);
},
);
}).toList(),
),
child: Obx(() {
return Column(
children: themeController.themeMap.entries.map((entry) {
final String themeName = entry.key;
final ThemeData themeData = entry.value;
final bool isSelected =
themeController.currentTheme.value == themeData;
return ListTile(
title: Text(themeName),
selected: isSelected,
selectedTileColor: Colors.blue.withValues(alpha: 0.2),
onTap: () async {
await themeController.updateTheme(themeName);
},
);
}).toList(),
);
}),
),
],
),
ListTile(
title: const Text('Einstellungen'),
title: const Text('Settings'),
onTap: () {
//context.go('/settings');
Navigator.pushReplacementNamed(context, '/settings');
Navigator.pop(context);
Get.toNamed('/settings');
},
),
ListTile(

View File

@ -1,29 +1,29 @@
import 'package:flutter/material.dart';
import 'package:f0ckapp/providers/media_provider.dart';
import 'package:get/get.dart';
import 'package:f0ckapp/services/api_service.dart';
class FilterBar extends StatelessWidget {
final MediaState mediaState;
final MediaNotifier mediaNotifier;
final ScrollController scrollController;
const FilterBar({
super.key,
required this.mediaState,
required this.mediaNotifier,
required this.scrollController,
});
@override
Widget build(BuildContext context) {
final ApiService c = Get.find<ApiService>();
return BottomAppBar(
height: 50,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
const Text('type: '),
DropdownButton<String>(
value: mediaTypes[mediaState.typeIndex],
Obx(() => DropdownButton<String>(
value: mediaTypes[c.type.value],
isDense: true,
items: mediaTypes.map((String value) {
return DropdownMenuItem<String>(
@ -33,14 +33,14 @@ class FilterBar extends StatelessWidget {
}).toList(),
onChanged: (String? newValue) {
if (newValue != null) {
mediaNotifier.setType(newValue);
c.setType(mediaTypes.indexOf(newValue));
scrollController.jumpTo(0);
}
},
),
)),
const Text('mode: '),
DropdownButton<String>(
value: mediaModes[mediaState.modeIndex],
Obx(() => DropdownButton<String>(
value: mediaModes[c.mode.value],
isDense: true,
items: mediaModes.map((String value) {
return DropdownMenuItem<String>(
@ -50,11 +50,11 @@ class FilterBar extends StatelessWidget {
}).toList(),
onChanged: (String? newValue) {
if (newValue != null) {
mediaNotifier.setMode(mediaModes.indexOf(newValue));
c.setMode(mediaModes.indexOf(newValue));
scrollController.jumpTo(0);
}
},
),
)),
],
),
);

View File

@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:get/get.dart';
import 'package:f0ckapp/models/mediaitem_model.dart';
@ -13,7 +14,8 @@ class MediaTile extends StatelessWidget {
Widget build(BuildContext context) {
return InkWell(
onTap: () {
Navigator.pushNamed(context, '/${item.id}');
//Navigator.pushNamed(context, '/${item.id}');
Get.toNamed('/${item.id}');
},
child: Stack(
fit: StackFit.expand,

View File

@ -4,13 +4,11 @@ import 'package:flutter/material.dart';
import 'package:cached_video_player_plus/cached_video_player_plus.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:f0ckapp/models/mediaitem_model.dart';
import 'package:f0ckapp/widgets/videooverlay_widget.dart';
import 'package:f0ckapp/providers/media_provider.dart';
class VideoWidget extends ConsumerStatefulWidget {
class VideoWidget extends StatefulWidget {
final MediaItem details;
final bool isActive;
final bool fullScreen;
@ -23,10 +21,10 @@ class VideoWidget extends ConsumerStatefulWidget {
});
@override
ConsumerState<VideoWidget> createState() => _VideoWidgetState();
State<VideoWidget> createState() => _VideoWidgetState();
}
class _VideoWidgetState extends ConsumerState<VideoWidget> {
class _VideoWidgetState extends State<VideoWidget> {
late CachedVideoPlayerPlusController _controller;
bool _showControls = false;
Timer? _hideControlsTimer;
@ -51,8 +49,8 @@ class _VideoWidgetState extends ConsumerState<VideoWidget> {
}
_controller.setLooping(true);
final bool muted = ref.read(mediaProvider).muted;
_controller.setVolume(muted ? 0.0 : 1.0);
//final bool muted = ref.read(mediaProvider).muted;
//_controller.setVolume(muted ? 0.0 : 1.0);
}
@override
@ -88,11 +86,11 @@ class _VideoWidgetState extends ConsumerState<VideoWidget> {
@override
Widget build(BuildContext context) {
final bool muted = ref.watch(mediaProvider).muted;
if (_controller.value.isInitialized &&
_controller.value.volume != (muted ? 0.0 : 1.0)) {
_controller.setVolume(muted ? 0.0 : 1.0);
}
//final bool muted = ref.watch(mediaProvider).muted;
//if (_controller.value.isInitialized &&
// _controller.value.volume != (muted ? 0.0 : 1.0)) {
// _controller.setVolume(muted ? 0.0 : 1.0);
//}
bool isAudio = widget.details.mime.startsWith('audio');

View File

@ -1,11 +1,8 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:cached_video_player_plus/cached_video_player_plus.dart';
import 'package:f0ckapp/providers/media_provider.dart';
class VideoControlsOverlay extends ConsumerWidget {
class VideoControlsOverlay extends StatelessWidget {
final CachedVideoPlayerPlusController controller;
final VoidCallback button;
@ -16,25 +13,11 @@ class VideoControlsOverlay extends ConsumerWidget {
});
@override
Widget build(BuildContext context, ref) {
final MediaState mediaState = ref.watch(mediaProvider);
final MediaNotifier mediaNotifier = ref.read(mediaProvider.notifier);
Widget build(BuildContext context) {
return Stack(
alignment: Alignment.center,
children: [
Positioned(
right: 12,
bottom: 12,
child: _ControlButton(
mediaState.muted ? Icons.volume_off : Icons.volume_up,
() {
button();
mediaNotifier.toggleMute();
},
size: 16,
),
),
Center(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,