Skip to content

Commit

Permalink
Added dropdownPlacement property.
Browse files Browse the repository at this point in the history
  • Loading branch information
Veselchak-U committed Oct 7, 2024
1 parent afb5858 commit 403cfb9
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 27 deletions.
24 changes: 12 additions & 12 deletions example/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -86,18 +86,18 @@ packages:
dependency: transitive
description:
name: leak_tracker
sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a"
sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05"
url: "https://pub.dev"
source: hosted
version: "10.0.4"
version: "10.0.5"
leak_tracker_flutter_testing:
dependency: transitive
description:
name: leak_tracker_flutter_testing
sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8"
sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806"
url: "https://pub.dev"
source: hosted
version: "3.0.3"
version: "3.0.5"
leak_tracker_testing:
dependency: transitive
description:
Expand Down Expand Up @@ -126,18 +126,18 @@ packages:
dependency: transitive
description:
name: material_color_utilities
sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a"
sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec
url: "https://pub.dev"
source: hosted
version: "0.8.0"
version: "0.11.1"
meta:
dependency: transitive
description:
name: meta
sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136"
sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7
url: "https://pub.dev"
source: hosted
version: "1.12.0"
version: "1.15.0"
path:
dependency: transitive
description:
Expand Down Expand Up @@ -195,10 +195,10 @@ packages:
dependency: transitive
description:
name: test_api
sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f"
sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb"
url: "https://pub.dev"
source: hosted
version: "0.7.0"
version: "0.7.2"
vector_math:
dependency: transitive
description:
Expand All @@ -211,10 +211,10 @@ packages:
dependency: transitive
description:
name: vm_service
sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec"
sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d"
url: "https://pub.dev"
source: hosted
version: "14.2.1"
version: "14.2.5"
sdks:
dart: ">=3.3.0 <4.0.0"
flutter: ">=3.18.0-18.0.pre.54"
14 changes: 13 additions & 1 deletion lib/custom_dropdown.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@ import 'package:flutter/scheduler.dart';

export 'custom_dropdown.dart';

part 'models/controllers.dart';
// models
part 'models/custom_dropdown_decoration.dart';
part 'models/custom_dropdown_list_filter.dart';
part 'models/disabled_decoration.dart';
part 'models/list_item_decoration.dart';
part 'models/controllers.dart';
part 'models/search_field_decoration.dart';
// utils
part 'utils/signatures.dart';
Expand All @@ -28,6 +28,8 @@ enum _DropdownType { singleSelect, multipleSelect }

enum _SearchType { onListData, onRequestData }

enum DropdownPlacement { top, bottom, auto }

const _defaultErrorColor = Colors.red;

const _defaultBorderRadius = BorderRadius.all(
Expand Down Expand Up @@ -180,6 +182,9 @@ class CustomDropdown<T> extends StatefulWidget {

final _DropdownType _dropdownType;

/// controls whether [CustomDropdown] dropdown is placed at the bottom or at the top
final DropdownPlacement dropdownPlacement;

CustomDropdown({
super.key,
required this.items,
Expand Down Expand Up @@ -207,6 +212,7 @@ class CustomDropdown<T> extends StatefulWidget {
this.excludeSelected = true,
this.enabled = true,
this.disabledDecoration,
this.dropdownPlacement = DropdownPlacement.auto,
}) : assert(
initialItem == null || controller == null,
'Only one of initialItem or controller can be specified at a time',
Expand Down Expand Up @@ -267,6 +273,7 @@ class CustomDropdown<T> extends StatefulWidget {
this.enabled = true,
this.disabledDecoration,
this.closeDropDownOnClearFilterSearch = false,
this.dropdownPlacement = DropdownPlacement.auto,
}) : assert(
initialItem == null || controller == null,
'Only one of initialItem or controller can be specified at a time',
Expand Down Expand Up @@ -326,6 +333,7 @@ class CustomDropdown<T> extends StatefulWidget {
this.enabled = true,
this.disabledDecoration,
this.closeDropDownOnClearFilterSearch = false,
this.dropdownPlacement = DropdownPlacement.auto,
}) : assert(
initialItem == null || controller == null,
'Only one of initialItem or controller can be specified at a time',
Expand Down Expand Up @@ -365,6 +373,7 @@ class CustomDropdown<T> extends StatefulWidget {
this.listItemPadding,
this.enabled = true,
this.disabledDecoration,
this.dropdownPlacement = DropdownPlacement.auto,
}) : assert(
initialItems == null || multiSelectController == null,
'Only one of initialItems or controller can be specified at a time',
Expand Down Expand Up @@ -427,6 +436,7 @@ class CustomDropdown<T> extends StatefulWidget {
this.enabled = true,
this.disabledDecoration,
this.closeDropDownOnClearFilterSearch = false,
this.dropdownPlacement = DropdownPlacement.auto,
}) : assert(
initialItems == null || multiSelectController == null,
'Only one of initialItems or controller can be specified at a time',
Expand Down Expand Up @@ -488,6 +498,7 @@ class CustomDropdown<T> extends StatefulWidget {
this.enabled = true,
this.disabledDecoration,
this.closeDropDownOnClearFilterSearch = false,
this.dropdownPlacement = DropdownPlacement.auto,
}) : assert(
initialItems == null || multiSelectController == null,
'Only one of initialItems or controller can be specified at a time',
Expand Down Expand Up @@ -673,6 +684,7 @@ class _CustomDropdownState<T> extends State<CustomDropdown<T>> {
searchRequestLoadingIndicator:
widget.searchRequestLoadingIndicator,
dropdownType: widget._dropdownType,
dropdownPlacement: widget.dropdownPlacement,
);
},
child: (showCallback) {
Expand Down
12 changes: 10 additions & 2 deletions lib/widgets/dropdown_overlay/dropdown_overlay.dart
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ class _DropdownOverlay<T> extends StatefulWidget {
final _NoResultFoundBuilder? noResultFoundBuilder;
final CustomDropdownDecoration? decoration;
final _DropdownType dropdownType;
final DropdownPlacement dropdownPlacement;

const _DropdownOverlay({
Key? key,
Expand All @@ -57,6 +58,7 @@ class _DropdownOverlay<T> extends StatefulWidget {
required this.maxLines,
required this.overlayHeight,
required this.dropdownType,
required this.dropdownPlacement,
required this.decoration,
required this.hintStyle,
required this.headerStyle,
Expand All @@ -82,7 +84,8 @@ class _DropdownOverlay<T> extends StatefulWidget {
}

class _DropdownOverlayState<T> extends State<_DropdownOverlay<T>> {
bool displayOverly = true, displayOverlayBottom = true;
bool displayOverly = true;
late bool displayOverlayBottom;
bool isSearchRequestLoading = false;
bool? mayFoundSearchRequestResult;
late List<T> items;
Expand Down Expand Up @@ -194,12 +197,17 @@ class _DropdownOverlayState<T> extends State<_DropdownOverlay<T>> {
void initState() {
super.initState();
scrollController = widget.itemsScrollCtrl ?? ScrollController();

displayOverlayBottom = widget.dropdownPlacement == DropdownPlacement.auto ||
widget.dropdownPlacement == DropdownPlacement.bottom;

WidgetsBinding.instance.addPostFrameCallback((_) {
final render1 = key1.currentContext?.findRenderObject() as RenderBox;
final render2 = key2.currentContext?.findRenderObject() as RenderBox;
final screenHeight = MediaQuery.of(context).size.height;
double y = render1.localToGlobal(Offset.zero).dy;
if (screenHeight - y < render2.size.height) {
if (screenHeight - y < render2.size.height &&
widget.dropdownPlacement == DropdownPlacement.auto) {
displayOverlayBottom = false;
setState(() {});
}
Expand Down
24 changes: 12 additions & 12 deletions pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -71,18 +71,18 @@ packages:
dependency: transitive
description:
name: leak_tracker
sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a"
sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05"
url: "https://pub.dev"
source: hosted
version: "10.0.4"
version: "10.0.5"
leak_tracker_flutter_testing:
dependency: transitive
description:
name: leak_tracker_flutter_testing
sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8"
sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806"
url: "https://pub.dev"
source: hosted
version: "3.0.3"
version: "3.0.5"
leak_tracker_testing:
dependency: transitive
description:
Expand Down Expand Up @@ -111,18 +111,18 @@ packages:
dependency: transitive
description:
name: material_color_utilities
sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a"
sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec
url: "https://pub.dev"
source: hosted
version: "0.8.0"
version: "0.11.1"
meta:
dependency: transitive
description:
name: meta
sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136"
sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7
url: "https://pub.dev"
source: hosted
version: "1.12.0"
version: "1.15.0"
path:
dependency: transitive
description:
Expand Down Expand Up @@ -180,10 +180,10 @@ packages:
dependency: transitive
description:
name: test_api
sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f"
sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb"
url: "https://pub.dev"
source: hosted
version: "0.7.0"
version: "0.7.2"
vector_math:
dependency: transitive
description:
Expand All @@ -196,10 +196,10 @@ packages:
dependency: transitive
description:
name: vm_service
sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec"
sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d"
url: "https://pub.dev"
source: hosted
version: "14.2.1"
version: "14.2.5"
sdks:
dart: ">=3.3.0 <4.0.0"
flutter: ">=3.18.0-18.0.pre.54"

0 comments on commit 403cfb9

Please sign in to comment.