@@ -56,57 +56,76 @@ class _DropdownControlState extends State<DropdownControl> {
5656 bool autofocus = widget.control.attrBool ("autofocus" , false )! ;
5757 bool disabled = widget.control.isDisabled || widget.parentDisabled;
5858
59+ var items = itemsView.children
60+ .where ((c) => c.name == null )
61+ .map <DropdownMenuItem <String >>(
62+ (Control itemCtrl) => DropdownMenuItem <String >(
63+ enabled: ! (disabled || itemCtrl.isDisabled),
64+ value: itemCtrl.attrs["key" ] ??
65+ itemCtrl.attrs["text" ] ??
66+ itemCtrl.id,
67+ child: Text (itemCtrl.attrs["text" ] ??
68+ itemCtrl.attrs["key" ] ??
69+ itemCtrl.id),
70+ ))
71+ .toList ();
72+
5973 String ? value = widget.control.attrString ("value" );
6074 if (_value != value) {
6175 _value = value;
6276 }
6377
78+ if (items.where ((item) => item.value == value).isEmpty) {
79+ _value = null ;
80+ }
81+
6482 var prefixControls = itemsView.children
6583 .where ((c) => c.name == "prefix" && c.isVisible);
6684 var suffixControls = itemsView.children
6785 .where ((c) => c.name == "suffix" && c.isVisible);
6886
69- var dropDown = DropdownButtonFormField <String >(
70- autofocus: autofocus,
71- focusNode: _focusNode,
72- value: _value,
73- decoration: buildInputDecoration (
74- widget.control,
75- prefixControls.isNotEmpty ? prefixControls.first : null ,
76- suffixControls.isNotEmpty ? suffixControls.first : null ,
77- null ),
78- onChanged: (String ? value) {
79- debugPrint ("Dropdown selected value: $value " );
80- setState (() {
81- _value = value! ;
82- });
83- List <Map <String , String >> props = [
84- {"i" : widget.control.id, "value" : value! }
85- ];
86- itemsView.dispatch (UpdateControlPropsAction (
87- UpdateControlPropsPayload (props: props)));
88- ws.updateControlProps (props: props);
89- ws.pageEventFromWeb (
90- eventTarget: widget.control.id,
91- eventName: "change" ,
92- eventData: value);
93- },
94- items: itemsView.children
95- .where ((c) => c.name == null )
96- .map <DropdownMenuItem <String >>((Control itemCtrl) {
97- return DropdownMenuItem <String >(
98- enabled: ! (disabled || itemCtrl.isDisabled),
99- value: itemCtrl.attrs["key" ] ??
100- itemCtrl.attrs["text" ] ??
101- itemCtrl.id,
102- child: Text (itemCtrl.attrs["text" ] ??
103- itemCtrl.attrs["key" ] ??
104- itemCtrl.id),
87+ return LayoutBuilder (
88+ builder: (BuildContext context, BoxConstraints constraints) {
89+ Widget dropDown = DropdownButtonFormField <String >(
90+ autofocus: autofocus,
91+ focusNode: _focusNode,
92+ value: _value,
93+ decoration: buildInputDecoration (
94+ widget.control,
95+ prefixControls.isNotEmpty ? prefixControls.first : null ,
96+ suffixControls.isNotEmpty ? suffixControls.first : null ,
97+ null ),
98+ onChanged: (String ? value) {
99+ debugPrint ("Dropdown selected value: $value " );
100+ setState (() {
101+ _value = value! ;
102+ });
103+ List <Map <String , String >> props = [
104+ {"i" : widget.control.id, "value" : value! }
105+ ];
106+ itemsView.dispatch (UpdateControlPropsAction (
107+ UpdateControlPropsPayload (props: props)));
108+ ws.updateControlProps (props: props);
109+ ws.pageEventFromWeb (
110+ eventTarget: widget.control.id,
111+ eventName: "change" ,
112+ eventData: value);
113+ },
114+ items: items,
105115 );
106- }).toList (),
107- );
108116
109- return constrainedControl (dropDown, widget.parent, widget.control);
117+ if (constraints.maxWidth == double .infinity &&
118+ widget.control.attrDouble ("width" ) == null ) {
119+ dropDown = ConstrainedBox (
120+ constraints: const BoxConstraints .tightFor (width: 300 ),
121+ child: dropDown,
122+ );
123+ }
124+
125+ return constrainedControl (
126+ dropDown, widget.parent, widget.control);
127+ },
128+ );
110129 });
111130 }
112131}
0 commit comments