Skip to content

Commit b89e73c

Browse files
committed
* Fixed bug of return when click outside the select items
* Improved validation of initialValue and items parameters
1 parent 9ad8d61 commit b89e73c

File tree

6 files changed

+72
-24
lines changed

6 files changed

+72
-24
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
## 2.1.0 - 2021-07-07
2+
3+
* Fixed bug of return when click outside the select items
4+
* Improved validation of initialValue and items parameters
5+
16
## 2.0.0 - 2021-03-09
27

38
* Migrate to null safety.

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
[![pub package](https://img.shields.io/pub/v/select_form_field.svg)](https://pub.dartlang.org/packages/select_form_field)
44

5+
<a href="https://www.buymeacoffee.com/hslbetto" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/v2/default-blue.png" alt="Buy Me A Beer" style="width: 150px !important;"></a>
6+
57
A Flutter select field widget. It shows a list of options in a dropdown menu.\
68
This widget extend TextField and has a similar behavior as TextFormField
79

@@ -12,7 +14,7 @@ In the `pubspec.yaml` of your flutter project, add the following dependency:
1214
```yaml
1315
dependencies:
1416
...
15-
select_form_field: "^2.0.0"
17+
select_form_field: "^2.1.0"
1618
```
1719
1820
In your library add the following import:

example/lib/main.dart

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,46 @@ class _MyHomePageState extends State<MyHomePage> {
4848
},
4949
];
5050

51+
/*final List<Map<String, dynamic>> _items = [
52+
{'value': 1},
53+
{'value': 2},
54+
{'value': 3},
55+
{'value': 4},
56+
{'value': 5},
57+
{'value': 6},
58+
{'value': 7},
59+
{'value': 8},
60+
{'value': 9},
61+
{'value': 10},
62+
{'value': 11},
63+
{'value': 12},
64+
{'value': 13},
65+
{'value': 14},
66+
{'value': 15},
67+
{'value': 16},
68+
{'value': 17},
69+
{'value': 18},
70+
{'value': 19},
71+
{'value': 20},
72+
{'value': 21},
73+
{'value': 22},
74+
{'value': 23},
75+
{'value': 24},
76+
{'value': 25},
77+
{'value': 26},
78+
{'value': 27},
79+
{'value': 28},
80+
{'value': 29},
81+
{'value': 30},
82+
{'value': 31},
83+
];*/
84+
5185
@override
5286
void initState() {
5387
super.initState();
5488

5589
//_initialValue = 'starValue';
56-
_controller = TextEditingController(text: 'starValue');
90+
_controller = TextEditingController(text: '2');
5791

5892
_getValue();
5993
}
@@ -82,7 +116,7 @@ class _MyHomePageState extends State<MyHomePage> {
82116
child: Column(
83117
children: <Widget>[
84118
SelectFormField(
85-
//type: SelectFormFieldType.dialog,
119+
type: SelectFormFieldType.dialog,
86120
controller: _controller,
87121
//initialValue: _initialValue,
88122
icon: Icon(Icons.format_shapes),

example/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ dependencies:
2828
# The following adds the Cupertino Icons font to your application.
2929
# Use with the CupertinoIcons class for iOS style icons.
3030
cupertino_icons: ^0.1.3
31-
select_form_field: #^2.0.0
31+
select_form_field: #^2.1.0
3232
path: ../
3333

3434
dev_dependencies:

lib/select_form_field.dart

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -429,11 +429,12 @@ class _SelectFormFieldState extends FormFieldState<String> {
429429
if (_effectiveController?.text != null &&
430430
_effectiveController?.text != '') {
431431
_item = widget.items?.firstWhere(
432-
(lmItem) => lmItem['value'].toString() == _effectiveController?.text,
433-
);
432+
(lmItem) => lmItem['value'].toString() == _effectiveController?.text,
433+
orElse: () => <String, dynamic>{});
434434

435-
if (_item != null) {
436-
_labelController.text = _item?['label'];
435+
if (_item!.length > 0) {
436+
_labelController.text =
437+
_item!['label']?.toString() ?? _item!['value']!.toString();
437438

438439
if (widget.changeIcon &&
439440
_item?['icon'] != null &&
@@ -469,11 +470,13 @@ class _SelectFormFieldState extends FormFieldState<String> {
469470
if (_effectiveController?.text != null &&
470471
_effectiveController?.text != '') {
471472
_item = widget.items?.firstWhere(
472-
(lmItem) => lmItem['value'] == _effectiveController?.text,
473+
(lmItem) => lmItem['value'].toString() == _effectiveController?.text,
474+
orElse: () => <String, dynamic>{},
473475
);
474476

475-
if (_item != null) {
476-
_labelController.text = _item?['label'];
477+
if (_item!.length > 0) {
478+
_labelController.text =
479+
_item!['label']?.toString() ?? _item!['value']!.toString();
477480

478481
if (widget.changeIcon &&
479482
_item?['icon'] != null &&
@@ -519,15 +522,16 @@ class _SelectFormFieldState extends FormFieldState<String> {
519522
initialValue: value,
520523
items: _renderItems(),
521524
);
522-
if (lvPicked == null) return;
523525

524-
if (lvPicked != value) {
526+
if (lvPicked != null && lvPicked != value) {
525527
_item = widget.items?.firstWhere(
526-
(lmItem) => lmItem['value'] == lvPicked,
528+
(lmItem) => lmItem['value'].toString() == lvPicked,
529+
orElse: () => <String, dynamic>{},
527530
);
528531

529-
if (_item != null) {
530-
_labelController.text = _item?['label'];
532+
if (_item!.length > 0) {
533+
_labelController.text =
534+
_item!['label']?.toString() ?? _item!['value']!.toString();
531535
_effectiveController?.text = lvPicked.toString();
532536

533537
if (widget.changeIcon &&
@@ -538,13 +542,13 @@ class _SelectFormFieldState extends FormFieldState<String> {
538542
});
539543
}
540544

541-
onChangedHandler(lvPicked.toString());
545+
onChangedHandler(lvPicked);
542546
}
543547
}
544548
}
545549

546550
Future<void> _showSelectFormFieldDialog() async {
547-
Map<String, dynamic> lvPicked = await showDialog<dynamic>(
551+
Map<String, dynamic>? lvPicked = await showDialog<dynamic>(
548552
context: context,
549553
builder: (BuildContext context) {
550554
return ItemPickerDialog(
@@ -558,7 +562,8 @@ class _SelectFormFieldState extends FormFieldState<String> {
558562
);
559563

560564
if (lvPicked is Map<String, dynamic>) {
561-
_labelController.text = lvPicked['label'];
565+
_labelController.text =
566+
lvPicked['label']?.toString() ?? lvPicked['value']!.toString();
562567
_effectiveController?.text = lvPicked['value'].toString();
563568

564569
if (widget.changeIcon &&
@@ -578,15 +583,16 @@ class _SelectFormFieldState extends FormFieldState<String> {
578583

579584
widget.items?.forEach((lmElement) {
580585
PopupMenuItem<String> loItem = PopupMenuItem<String>(
581-
value: lmElement['value'],
586+
value: lmElement['value'].toString(),
582587
enabled: lmElement['enable'] ?? true,
583588
textStyle: lmElement['textStyle'] ?? lmElement['textStyle'],
584589
child: Row(
585590
children: [
586591
lmElement['icon'] ?? SizedBox(width: 5),
587592
Expanded(
588593
child: Text(
589-
lmElement['label'] ?? lmElement['value'],
594+
lmElement['label']?.toString() ??
595+
lmElement['value']!.toString(),
590596
overflow: TextOverflow.fade,
591597
maxLines: 1,
592598
softWrap: false,
@@ -743,7 +749,8 @@ class _ItemPickerDialogState extends State<ItemPickerDialog> {
743749
_lItemListShow.clear();
744750

745751
_lItemListOriginal.forEach((loCredential) {
746-
lsValue = loCredential['label'].toLowerCase();
752+
lsValue = loCredential['label']?.toString().toLowerCase() ??
753+
loCredential['value']!.toString().toLowerCase();
747754

748755
if (lsValue.contains(lsQuery)) {
749756
_lItemListShow.add(loCredential);
@@ -785,7 +792,7 @@ class ListItem extends StatelessWidget {
785792
Widget loIten = ListTile(
786793
leading: lmItem['icon'] ?? null,
787794
title: Text(
788-
lmItem['label'] ?? lmItem['value'],
795+
lmItem['label']?.toString() ?? lmItem['value']!.toString(),
789796
style: lmItem['textStyle'] ?? lmItem['textStyle'],
790797
),
791798
enabled: lmItem['enable'] ?? true,

pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: select_form_field
22
description: A Flutter select form field widget. It shows a list of options in a dropdown menu.
3-
version: 2.0.0
3+
version: 2.1.0
44
homepage: https://github.com/m3uzz/select_form_field
55

66
environment:

0 commit comments

Comments
 (0)