mirror of
https://github.com/vodemn/m3_lightmeter.git
synced 2025-09-05 11:56:41 +00:00
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:
parent
49d0a2175f
commit
872f279637
1 changed files with 12 additions and 6 deletions
|
@ -29,8 +29,6 @@ class AnimatedDialog extends StatefulWidget {
|
||||||
}
|
}
|
||||||
|
|
||||||
class AnimatedDialogState extends State<AnimatedDialog> with SingleTickerProviderStateMixin {
|
class AnimatedDialogState extends State<AnimatedDialog> with SingleTickerProviderStateMixin {
|
||||||
final GlobalKey _key = GlobalKey();
|
|
||||||
|
|
||||||
late Size _closedSize;
|
late Size _closedSize;
|
||||||
late Offset _closedOffset;
|
late Offset _closedOffset;
|
||||||
|
|
||||||
|
@ -129,7 +127,6 @@ class AnimatedDialogState extends State<AnimatedDialog> with SingleTickerProvide
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return GestureDetector(
|
return GestureDetector(
|
||||||
key: _key,
|
|
||||||
onTap: _openDialog,
|
onTap: _openDialog,
|
||||||
child: Opacity(
|
child: Opacity(
|
||||||
opacity: _isDialogShown ? 0 : 1,
|
opacity: _isDialogShown ? 0 : 1,
|
||||||
|
@ -140,13 +137,13 @@ class AnimatedDialogState extends State<AnimatedDialog> with SingleTickerProvide
|
||||||
|
|
||||||
void _setClosedOffset() {
|
void _setClosedOffset() {
|
||||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||||
final renderBox = _key.currentContext?.findRenderObject()! as RenderBox?;
|
final renderBox = context.findRenderObject()! as RenderBox?;
|
||||||
if (renderBox != null) {
|
if (renderBox != null) {
|
||||||
final size = MediaQuery.sizeOf(context);
|
final size = MediaQuery.sizeOf(context);
|
||||||
final padding = MediaQuery.paddingOf(context);
|
final padding = MediaQuery.paddingOf(context);
|
||||||
final maxWidth = size.width - padding.horizontal - Dimens.dialogMargin.horizontal;
|
final maxWidth = size.width - padding.horizontal - Dimens.dialogMargin.horizontal;
|
||||||
final maxHeight = size.height - padding.vertical - Dimens.dialogMargin.vertical;
|
final maxHeight = size.height - padding.vertical - Dimens.dialogMargin.vertical;
|
||||||
_closedSize = _key.currentContext!.size!;
|
_closedSize = context.size!;
|
||||||
_sizeTween = SizeTween(
|
_sizeTween = SizeTween(
|
||||||
begin: _closedSize,
|
begin: _closedSize,
|
||||||
end: Size(
|
end: Size(
|
||||||
|
@ -156,7 +153,16 @@ class AnimatedDialogState extends State<AnimatedDialog> with SingleTickerProvide
|
||||||
);
|
);
|
||||||
_sizeAnimation = _sizeTween.animate(_defaultCurvedAnimation);
|
_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(
|
_offsetAnimation = SizeTween(
|
||||||
begin: Size(
|
begin: Size(
|
||||||
_closedOffset.dx + _closedSize.width / 2,
|
_closedOffset.dx + _closedSize.width / 2,
|
||||||
|
|
Loading…
Reference in a new issue