@@ -16,6 +16,7 @@ class _DropdownRoute<T> extends PopupRoute<_DropdownRouteResult<T>> {
1616 required this .barrierCoversButton,
1717 required this .parentFocusNode,
1818 required this .enableFeedback,
19+ required this .textDirection,
1920 required this .dropdownStyle,
2021 required this .menuItemStyle,
2122 required this .inputDecorationPadding,
@@ -34,6 +35,7 @@ class _DropdownRoute<T> extends PopupRoute<_DropdownRouteResult<T>> {
3435 final TextStyle style;
3536 final FocusNode parentFocusNode;
3637 final bool enableFeedback;
38+ final TextDirection ? textDirection;
3739 final DropdownStyleData dropdownStyle;
3840 final MenuItemStyleData menuItemStyle;
3941 final EdgeInsets ? inputDecorationPadding;
@@ -61,46 +63,49 @@ class _DropdownRoute<T> extends PopupRoute<_DropdownRouteResult<T>> {
6163
6264 @override
6365 Widget buildPage (BuildContext context, _, __) {
64- return FocusScope .withExternalFocusNode (
65- focusScopeNode: _childNode,
66- parentNode: parentFocusNode,
67- child: LayoutBuilder (
68- builder: (BuildContext ctx, BoxConstraints constraints) {
69- //Exclude BottomInset from maxHeight to avoid overlapping menu items
70- //with keyboard when using searchable dropdown.
71- //This will ensure menu is drawn in the actual available height.
72- final padding = MediaQuery .paddingOf (context);
73- final viewInsets = MediaQuery .viewInsetsOf (context);
74- final BoxConstraints actualConstraints =
75- constraints.copyWith (maxHeight: constraints.maxHeight - viewInsets.bottom);
76- final EdgeInsets mediaQueryPadding =
77- dropdownStyle.useSafeArea ? padding : EdgeInsets .zero;
78- return ValueListenableBuilder <Rect ?>(
79- valueListenable: buttonRect,
80- builder: (BuildContext context, Rect ? rect, _) {
81- final routePage = _DropdownRoutePage <T >(
82- route: this ,
83- constraints: actualConstraints,
84- mediaQueryPadding: mediaQueryPadding,
85- buttonRect: rect! ,
86- selectedIndex: selectedIndex,
87- capturedThemes: capturedThemes,
88- style: style,
89- enableFeedback: enableFeedback,
90- );
91- return barrierCoversButton
92- ? routePage
93- : _CustomModalBarrier (
94- barrierColor: _altBarrierColor,
95- animation: animation,
96- barrierCurve: barrierCurve,
97- buttonRect: rect,
98- buttonBorderRadius: buttonBorderRadius ?? BorderRadius .zero,
99- child: routePage,
100- );
101- },
102- );
103- },
66+ return Directionality (
67+ textDirection: textDirection ?? Directionality .of (context),
68+ child: FocusScope .withExternalFocusNode (
69+ focusScopeNode: _childNode,
70+ parentNode: parentFocusNode,
71+ child: LayoutBuilder (
72+ builder: (BuildContext ctx, BoxConstraints constraints) {
73+ //Exclude BottomInset from maxHeight to avoid overlapping menu items
74+ //with keyboard when using searchable dropdown.
75+ //This will ensure menu is drawn in the actual available height.
76+ final padding = MediaQuery .paddingOf (context);
77+ final viewInsets = MediaQuery .viewInsetsOf (context);
78+ final BoxConstraints actualConstraints =
79+ constraints.copyWith (maxHeight: constraints.maxHeight - viewInsets.bottom);
80+ final EdgeInsets mediaQueryPadding =
81+ dropdownStyle.useSafeArea ? padding : EdgeInsets .zero;
82+ return ValueListenableBuilder <Rect ?>(
83+ valueListenable: buttonRect,
84+ builder: (BuildContext context, Rect ? rect, _) {
85+ final routePage = _DropdownRoutePage <T >(
86+ route: this ,
87+ constraints: actualConstraints,
88+ mediaQueryPadding: mediaQueryPadding,
89+ buttonRect: rect! ,
90+ selectedIndex: selectedIndex,
91+ capturedThemes: capturedThemes,
92+ style: style,
93+ enableFeedback: enableFeedback,
94+ );
95+ return barrierCoversButton
96+ ? routePage
97+ : _CustomModalBarrier (
98+ barrierColor: _altBarrierColor,
99+ animation: animation,
100+ barrierCurve: barrierCurve,
101+ buttonRect: rect,
102+ buttonBorderRadius: buttonBorderRadius ?? BorderRadius .zero,
103+ child: routePage,
104+ );
105+ },
106+ );
107+ },
108+ ),
104109 ),
105110 );
106111 }
@@ -503,18 +508,21 @@ class _CustomModalBarrierState extends State<_CustomModalBarrier> {
503508
504509 return Stack (
505510 children: [
506- ValueListenableBuilder (
507- valueListenable: color,
508- builder: (BuildContext context, Color ? value, Widget ? child) {
509- return CustomPaint (
510- painter: _DropdownBarrierPainter (
511- barrierColor: value,
512- buttonRect: widget.buttonRect,
513- buttonBorderRadius: widget.buttonBorderRadius,
514- pageSize: size,
515- ),
516- );
517- },
511+ IgnorePointer (
512+ child: ValueListenableBuilder (
513+ valueListenable: color,
514+ builder: (BuildContext context, Color ? value, Widget ? child) {
515+ return CustomPaint (
516+ size: Size (size.width, size.height),
517+ painter: _DropdownBarrierPainter (
518+ barrierColor: value,
519+ buttonRect: widget.buttonRect,
520+ buttonBorderRadius: widget.buttonBorderRadius,
521+ pageSize: size,
522+ ),
523+ );
524+ },
525+ ),
518526 ),
519527 widget.child,
520528 ],
@@ -538,15 +546,10 @@ class _DropdownBarrierPainter extends CustomPainter {
538546 @override
539547 void paint (Canvas canvas, Size size) {
540548 if (barrierColor != null ) {
541- final Rect rect = Rect .fromLTRB (
542- - buttonRect.left,
543- - buttonRect.top,
544- pageSize.width,
545- pageSize.height,
546- );
549+ final Rect pageRect = Offset .zero & pageSize;
547550
548- canvas.saveLayer (rect , Paint ());
549- canvas.drawRect (rect , Paint ()..color = barrierColor! );
551+ canvas.saveLayer (pageRect , Paint ());
552+ canvas.drawRect (pageRect , Paint ()..color = barrierColor! );
550553
551554 final RRect buttonRRect = RRect .fromRectAndCorners (
552555 buttonRect,
0 commit comments