Fix: menu positioning in CupertinoNavigationBar on Flutter 3.35.x #76
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Summary
Fixes menu positioning and animation issues when PullDownButton is used in CupertinoNavigationBar's trailing widget on Flutter 3.35.0+.
Fixes #74
Videos
before.mp4
after.mp4
Root Cause
Flutter 3.35.0 introduced a regression (via PR flutter/flutter#168866) where CupertinoNavigationBar wraps its children (leading, middle, trailing) with a new MediaQueryData that only sets the textScaler field:
This causes all other MediaQueryData fields to reset to defaults:
size→Size(0, 0)padding→EdgeInsets.zerodevicePixelRatio→1.0PullDownButton's positioning logic relies on
MediaQuery.of(context).sizeto calculate screen bounds, which now returns invalid dimensions when the button is inside CupertinoNavigationBar's trailing widget.Solution
Pass the navigator overlay's context for MediaQuery lookups instead of using the button's context. The overlay always has complete MediaQueryData with correct screen dimensions.
Changes:
mediaQueryContextparameter togetRect()inextensions.dartoverlayContextparameter toanimationAlignment()inroute.dartpull_down_button.dartto passnavigator.overlay!.context