Compare commits

...

1 Commits

Author SHA1 Message Date
Thomas Way c2d7a9f5c4 fix(mobile): fix stale refs in use timer
The timer hook preserved the values of the original local variables,
which caused issues when hiding controls for videos. The callback can be
changed so that it always sees the latest value with useRef, and it can
be simplified significantly using a function rather than state class.
2026-04-05 03:59:19 +01:00
+13 -32
View File
@@ -1,36 +1,17 @@
import 'package:async/async.dart'; import 'package:async/async.dart';
import 'package:flutter/material.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_hooks/flutter_hooks.dart';
RestartableTimer useTimer(Duration duration, void Function() callback) { RestartableTimer useTimer(Duration duration, VoidCallback callback) {
return use(_TimerHook(duration: duration, callback: callback)); final latest = useRef(callback);
} latest.value = callback;
class _TimerHook extends Hook<RestartableTimer> { final timer = useMemoized(
final Duration duration; () => RestartableTimer(duration, () => latest.value()),
final void Function() callback; [duration],
);
const _TimerHook({required this.duration, required this.callback});
@override useEffect(() => timer.cancel, [timer]);
HookState<RestartableTimer, Hook<RestartableTimer>> createState() => _TimerHookState();
} return timer;
class _TimerHookState extends HookState<RestartableTimer, _TimerHook> {
late RestartableTimer timer;
@override
void initHook() {
super.initHook();
timer = RestartableTimer(hook.duration, hook.callback);
}
@override
RestartableTimer build(BuildContext context) {
return timer;
}
@override
void dispose() {
timer.cancel();
super.dispose();
}
} }