ML-240 Animated picker jumps off-screen after values list changes (#270)

* check for negative offset

* catch late init error
This commit is contained in:
Vadim 2025-08-29 10:55:03 +02:00 committed by GitHub
parent 49d0a2175f
commit 872f279637
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -29,8 +29,6 @@ class AnimatedDialog extends StatefulWidget {
}
class AnimatedDialogState extends State<AnimatedDialog> with SingleTickerProviderStateMixin {
final GlobalKey _key = GlobalKey();
late Size _closedSize;
late Offset _closedOffset;
@ -129,7 +127,6 @@ class AnimatedDialogState extends State<AnimatedDialog> with SingleTickerProvide
@override
Widget build(BuildContext context) {
return GestureDetector(
key: _key,
onTap: _openDialog,
child: Opacity(
opacity: _isDialogShown ? 0 : 1,
@ -140,13 +137,13 @@ class AnimatedDialogState extends State<AnimatedDialog> with SingleTickerProvide
void _setClosedOffset() {
WidgetsBinding.instance.addPostFrameCallback((_) {
final renderBox = _key.currentContext?.findRenderObject()! as RenderBox?;
final renderBox = context.findRenderObject()! as RenderBox?;
if (renderBox != null) {
final size = MediaQuery.sizeOf(context);
final padding = MediaQuery.paddingOf(context);
final maxWidth = size.width - padding.horizontal - Dimens.dialogMargin.horizontal;
final maxHeight = size.height - padding.vertical - Dimens.dialogMargin.vertical;
_closedSize = _key.currentContext!.size!;
_closedSize = context.size!;
_sizeTween = SizeTween(
begin: _closedSize,
end: Size(
@ -156,7 +153,16 @@ class AnimatedDialogState extends State<AnimatedDialog> with SingleTickerProvide
);
_sizeAnimation = _sizeTween.animate(_defaultCurvedAnimation);
_closedOffset = renderBox.localToGlobal(Offset.zero);
final globalOffset = renderBox.localToGlobal(Offset.zero);
try {
_closedOffset = Offset(
//TODO: when updating layout or changing one of selected picker values, X offset is negative for some reason
globalOffset.dx > 0 ? globalOffset.dx : _closedOffset.dx,
globalOffset.dy,
);
} catch (_) {
_closedOffset = globalOffset;
}
_offsetAnimation = SizeTween(
begin: Size(
_closedOffset.dx + _closedSize.width / 2,