From 7fc6167fa75c8483e649c2418bb048ef416681d0 Mon Sep 17 00:00:00 2001 From: Ahmed Elsayed Date: Sat, 28 Feb 2026 22:36:34 +0200 Subject: [PATCH] Fix dropdown menu width not matching button width with OutlineInputBorder --- packages/dropdown_button2/CHANGELOG.md | 1 + .../lib/src/dropdown_button2.dart | 19 ++++++++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/packages/dropdown_button2/CHANGELOG.md b/packages/dropdown_button2/CHANGELOG.md index 3db88b8..b2e6f7b 100644 --- a/packages/dropdown_button2/CHANGELOG.md +++ b/packages/dropdown_button2/CHANGELOG.md @@ -2,6 +2,7 @@ - Remove temporary fix for list not respecting itemCount when calling itemExtentBuilder. - Fix selected index not updating when items list changes, closes #392. +- Fix dropdown menu width not matching button width with OutlineInputBorder. ## 3.0.0-beta.24 diff --git a/packages/dropdown_button2/lib/src/dropdown_button2.dart b/packages/dropdown_button2/lib/src/dropdown_button2.dart index 1de304e..3b8405c 100644 --- a/packages/dropdown_button2/lib/src/dropdown_button2.dart +++ b/packages/dropdown_button2/lib/src/dropdown_button2.dart @@ -595,14 +595,27 @@ class _DropdownButton2State extends State> with WidgetsBin EdgeInsets? _getInputDecorationPadding() { // Return the contentPadding only if inputDecoration is defined. if (widget._inputDecoration case final decoration?) { + final ThemeData theme = Theme.of(context); final TextDirection? textDirection = Directionality.maybeOf(context); - // Use inputDecorationTheme.visualDensity when added (https://github.com/flutter/flutter/issues/166201#issuecomment-2774622584) - final Offset densityOffset = Theme.of(context).visualDensity.baseSizeAdjustment; + final EdgeInsets? contentPadding = - (decoration.contentPadding ?? Theme.of(context).inputDecorationTheme.contentPadding) + (decoration.contentPadding ?? theme.inputDecorationTheme.contentPadding) ?.resolve(textDirection); + + // InputDecorator adds gapPadding horizontally for OutlineInputBorder. + final border = decoration.border ?? theme.inputDecorationTheme.border; + final double gapPadding = switch (border) { + OutlineInputBorder(:final gapPadding) => gapPadding, + _ => 0.0, + }; + + // Use inputDecorationTheme.visualDensity when added (https://github.com/flutter/flutter/issues/166201#issuecomment-2774622584) + final Offset densityOffset = theme.visualDensity.baseSizeAdjustment; + return contentPadding?.copyWith( + left: contentPadding.left + gapPadding, top: math.max(0, contentPadding.top + densityOffset.dy / 2), + right: contentPadding.right + gapPadding, bottom: math.max(0, contentPadding.bottom + densityOffset.dy / 2), ); } else {