Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions packages/dropdown_button2/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
## UNRELEASED

- Fix errorStyle has no effect for DropdownButtonFormField2, closes #327.
- DropdownRoutePage should dispose the created ScrollController [Flutter core].

## 3.0.0-beta.21

Expand Down
5 changes: 4 additions & 1 deletion packages/dropdown_button2/lib/src/dropdown_menu.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ class _DropdownMenu<T> extends StatefulWidget {
const _DropdownMenu({
super.key,
required this.route,
required this.scrollController,
required this.textDirection,
required this.buttonRect,
required this.constraints,
Expand All @@ -25,6 +26,7 @@ class _DropdownMenu<T> extends StatefulWidget {
});

final _DropdownRoute<T> route;
final ScrollController scrollController;
final TextDirection? textDirection;
final Rect buttonRect;
final BoxConstraints constraints;
Expand All @@ -50,6 +52,7 @@ class _DropdownMenuState<T> extends State<_DropdownMenu<T>> {
_DropdownItemButton<T> dropdownItemButton(int index) =>
_DropdownItemButton<T>(
route: widget.route,
scrollController: widget.scrollController,
textDirection: widget.textDirection,
buttonRect: widget.buttonRect,
constraints: widget.constraints,
Expand Down Expand Up @@ -177,7 +180,7 @@ class _DropdownMenuState<T> extends State<_DropdownMenu<T>> {
platform: Theme.of(context).platform,
),
child: PrimaryScrollController(
controller: route.scrollController!,
controller: widget.scrollController,
child: Theme(
data: Theme.of(context).copyWith(
scrollbarTheme: dropdownStyle.scrollbarTheme,
Expand Down
4 changes: 3 additions & 1 deletion packages/dropdown_button2/lib/src/dropdown_menu_item.dart
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,7 @@ class _DropdownItemButton<T> extends StatefulWidget {
const _DropdownItemButton({
super.key,
required this.route,
required this.scrollController,
required this.textDirection,
required this.buttonRect,
required this.constraints,
Expand All @@ -133,6 +134,7 @@ class _DropdownItemButton<T> extends StatefulWidget {
});

final _DropdownRoute<T> route;
final ScrollController scrollController;
final TextDirection? textDirection;
final Rect buttonRect;
final BoxConstraints constraints;
Expand Down Expand Up @@ -163,7 +165,7 @@ class _DropdownItemButtonState<T> extends State<_DropdownItemButton<T>> {
widget.mediaQueryPadding,
widget.itemIndex,
);
widget.route.scrollController!.animateTo(
widget.scrollController.animateTo(
menuLimits.scrollOffset,
curve: Curves.easeInOut,
duration: const Duration(milliseconds: 100),
Expand Down
65 changes: 39 additions & 26 deletions packages/dropdown_button2/lib/src/dropdown_route.dart
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,6 @@ class _DropdownRoute<T> extends PopupRoute<_DropdownRouteResult<T>> {
final DropdownSearchData<T>? searchData;
final DropdownSeparator<T>? dropdownSeparator;

ScrollController? scrollController;

@override
Duration get transitionDuration => _kDropdownMenuDuration;

Expand Down Expand Up @@ -250,7 +248,7 @@ class _DropdownRoute<T> extends PopupRoute<_DropdownRouteResult<T>> {
}
}

class _DropdownRoutePage<T> extends StatelessWidget {
class _DropdownRoutePage<T> extends StatefulWidget {
const _DropdownRoutePage({
super.key,
required this.route,
Expand All @@ -275,35 +273,50 @@ class _DropdownRoutePage<T> extends StatelessWidget {
final bool enableFeedback;

@override
Widget build(BuildContext context) {
assert(debugCheckHasDirectionality(context));
State<_DropdownRoutePage<T>> createState() => _DropdownRoutePageState<T>();
}

class _DropdownRoutePageState<T> extends State<_DropdownRoutePage<T>> {
late ScrollController _scrollController;

@override
void initState() {
super.initState();
// Computing the initialScrollOffset now, before the items have been laid
// out. This only works if the item heights are effectively fixed, i.e. either
// DropdownButton.itemHeight is specified or DropdownButton.itemHeight is null
// and all of the items' intrinsic heights are less than _kMenuItemHeight.
// Otherwise the initialScrollOffset is just a rough approximation based on
// treating the items as if their heights were all equal to _kMenuItemHeight.
if (route.scrollController == null) {
final _MenuLimits menuLimits = route.getMenuLimits(
buttonRect,
constraints.maxHeight,
mediaQueryPadding,
selectedIndex,
);
route.scrollController =
ScrollController(initialScrollOffset: menuLimits.scrollOffset);
}
final _MenuLimits menuLimits = widget.route.getMenuLimits(
widget.buttonRect,
widget.constraints.maxHeight,
widget.mediaQueryPadding,
widget.selectedIndex,
);
_scrollController =
ScrollController(initialScrollOffset: menuLimits.scrollOffset);
}

final TextDirection? textDirection = Directionality.maybeOf(context);
@override
void dispose() {
_scrollController.dispose();
super.dispose();
}

@override
Widget build(BuildContext context) {
assert(debugCheckHasDirectionality(context));

final TextDirection? textDirection = Directionality.maybeOf(context);
final Widget menu = _DropdownMenu<T>(
route: route,
route: widget.route,
scrollController: _scrollController,
textDirection: textDirection,
buttonRect: buttonRect,
constraints: constraints,
mediaQueryPadding: mediaQueryPadding,
enableFeedback: enableFeedback,
buttonRect: widget.buttonRect,
constraints: widget.constraints,
mediaQueryPadding: widget.mediaQueryPadding,
enableFeedback: widget.enableFeedback,
);

return MediaQuery.removePadding(
Expand All @@ -316,13 +329,13 @@ class _DropdownRoutePage<T> extends StatelessWidget {
builder: (BuildContext context) {
return CustomSingleChildLayout(
delegate: _DropdownMenuRouteLayout<T>(
route: route,
route: widget.route,
textDirection: textDirection,
buttonRect: buttonRect,
availableHeight: constraints.maxHeight,
mediaQueryPadding: mediaQueryPadding,
buttonRect: widget.buttonRect,
availableHeight: widget.constraints.maxHeight,
mediaQueryPadding: widget.mediaQueryPadding,
),
child: capturedThemes.wrap(menu),
child: widget.capturedThemes.wrap(menu),
);
},
),
Expand Down