fix: Bunc of uncaught exceptions

This commit is contained in:
PartyDonut 2025-08-30 09:32:20 +02:00
parent 9c964e7b41
commit 9f6aa1e489
6 changed files with 34 additions and 23 deletions

View file

@ -88,10 +88,12 @@ class _PhotoViewerScreenState extends ConsumerState<PhotoViewerScreen> with Widg
final newItems = await Future.value(widget.loadingItems); final newItems = await Future.value(widget.loadingItems);
setState(() { if (context.mounted) {
photos = {...photos, ...newItems}.toList(); setState(() {
loadingItems = false; photos = {...photos, ...newItems}.toList();
}); loadingItems = false;
});
}
} }
}, },
); );

View file

@ -2,9 +2,11 @@ import 'package:flutter/material.dart';
import 'package:fladder/util/adaptive_layout/adaptive_layout.dart'; import 'package:fladder/util/adaptive_layout/adaptive_layout.dart';
Future<void> showDialogAdaptive( Future<void> showDialogAdaptive({
{required BuildContext context, required Widget Function(BuildContext context) builder}) { required BuildContext context,
if (AdaptiveLayout.of(context).inputDevice == InputDevice.pointer) { required Widget Function(BuildContext context) builder,
}) {
if (AdaptiveLayout.viewSizeOf(context) >= ViewSize.tablet) {
return showDialog( return showDialog(
context: context, context: context,
useSafeArea: false, useSafeArea: false,

View file

@ -58,7 +58,7 @@ class _PosterImageState extends ConsumerState<PosterImage> {
late String currentTag = widget.heroTag == true ? widget.poster.id : UniqueKey().toString(); late String currentTag = widget.heroTag == true ? widget.poster.id : UniqueKey().toString();
bool hover = false; bool hover = false;
void pressedWidget() async { void pressedWidget(BuildContext context) async {
if (widget.heroTag == false) { if (widget.heroTag == false) {
setState(() { setState(() {
currentTag = widget.poster.id; currentTag = widget.poster.id;
@ -67,15 +67,12 @@ class _PosterImageState extends ConsumerState<PosterImage> {
if (widget.onPressed != null) { if (widget.onPressed != null) {
widget.onPressed?.call(() async { widget.onPressed?.call(() async {
await navigateToDetails(); await navigateToDetails();
if (context.mounted) { context.refreshData();
context.refreshData();
}
}, widget.poster); }, widget.poster);
} else { } else {
await navigateToDetails(); await navigateToDetails();
if (context.mounted) { if (!context.mounted) return;
context.refreshData(); context.refreshData();
}
} }
} }
@ -319,7 +316,7 @@ class _PosterImageState extends ConsumerState<PosterImage> {
Focus( Focus(
onFocusChange: (value) => setState(() => hover = value), onFocusChange: (value) => setState(() => hover = value),
child: FlatButton( child: FlatButton(
onTap: pressedWidget, onTap: () => pressedWidget(context),
onSecondaryTapDown: (details) async { onSecondaryTapDown: (details) async {
Offset localPosition = details.globalPosition; Offset localPosition = details.globalPosition;
RelativeRect position = RelativeRect.fromLTRB( RelativeRect position = RelativeRect.fromLTRB(
@ -391,7 +388,7 @@ class _PosterImageState extends ConsumerState<PosterImage> {
Material( Material(
color: Colors.transparent, color: Colors.transparent,
child: InkWell( child: InkWell(
onTap: pressedWidget, onTap: () => pressedWidget(context),
onLongPress: () { onLongPress: () {
showBottomSheetPill( showBottomSheetPill(
context: context, context: context,

View file

@ -52,7 +52,7 @@ class FladderImage extends ConsumerWidget {
), ),
if (!blurOnly) if (!blurOnly)
FadeInImage( FadeInImage(
placeholder: Image.memory(kTransparentImage).image, placeholder: MemoryImage(kTransparentImage),
fit: fit, fit: fit,
placeholderFit: fit, placeholderFit: fit,
excludeFromSemantics: true, excludeFromSemantics: true,

View file

@ -27,12 +27,21 @@ class _TrickPlayImageState extends ConsumerState<TrickPlayImage> {
late Offset currentOffset = const Offset(0, 0); late Offset currentOffset = const Offset(0, 0);
String? currentUrl; String? currentUrl;
bool _isMounted = true;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
loadImage(); loadImage();
} }
@override
void dispose() {
image?.dispose();
_isMounted = false;
super.dispose();
}
@override @override
void didUpdateWidget(covariant TrickPlayImage oldWidget) { void didUpdateWidget(covariant TrickPlayImage oldWidget) {
super.didUpdateWidget(oldWidget); super.didUpdateWidget(oldWidget);
@ -55,6 +64,7 @@ class _TrickPlayImageState extends ConsumerState<TrickPlayImage> {
} }
Future<void> loadImage() async { Future<void> loadImage() async {
if (!_isMounted) return;
if (model.images.isEmpty) return; if (model.images.isEmpty) return;
final newUrl = model.getTile(time); final newUrl = model.getTile(time);
currentOffset = model.offset(time); currentOffset = model.offset(time);
@ -76,11 +86,10 @@ class _TrickPlayImageState extends ConsumerState<TrickPlayImage> {
final Uint8List bytes = response.bodyBytes; final Uint8List bytes = response.bodyBytes;
final ui.Codec codec = await ui.instantiateImageCodec(bytes); final ui.Codec codec = await ui.instantiateImageCodec(bytes);
final ui.FrameInfo frameInfo = await codec.getNextFrame(); final ui.FrameInfo frameInfo = await codec.getNextFrame();
if (context.mounted) { if (!_isMounted) return;
setState(() { setState(() {
image = frameInfo.image; image = frameInfo.image;
}); });
}
} else { } else {
throw Exception('Failed to load network image'); throw Exception('Failed to load network image');
} }
@ -90,6 +99,7 @@ class _TrickPlayImageState extends ConsumerState<TrickPlayImage> {
final Uint8List bytes = await File(path).readAsBytes(); final Uint8List bytes = await File(path).readAsBytes();
final ui.Codec codec = await ui.instantiateImageCodec(bytes); final ui.Codec codec = await ui.instantiateImageCodec(bytes);
final ui.FrameInfo frameInfo = await codec.getNextFrame(); final ui.FrameInfo frameInfo = await codec.getNextFrame();
if (!_isMounted) return;
setState(() { setState(() {
image = frameInfo.image; image = frameInfo.image;
}); });

View file

@ -53,6 +53,7 @@ class MediaControlsWrapper extends BaseAudioHandler {
Future<void> init() async { Future<void> init() async {
if (!initMediaControls) { if (!initMediaControls) {
initMediaControls = true;
await AudioService.init( await AudioService.init(
builder: () => this, builder: () => this,
config: const AudioServiceConfig( config: const AudioServiceConfig(
@ -66,7 +67,6 @@ class MediaControlsWrapper extends BaseAudioHandler {
androidShowNotificationBadge: true, androidShowNotificationBadge: true,
), ),
); );
initMediaControls = true;
} }
final player = switch (ref.read(videoPlayerSettingsProvider.select((value) => value.wantedPlayer))) { final player = switch (ref.read(videoPlayerSettingsProvider.select((value) => value.wantedPlayer))) {