Skip to content

Commit cae40c6

Browse files
Fixes to SearchBar (#2243)
* Fixes to SearchBar * Update value as we type
1 parent 24f952c commit cae40c6

File tree

5 files changed

+65
-70
lines changed

5 files changed

+65
-70
lines changed

package/lib/src/controls/create_control.dart

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,11 @@ import '../utils/theme.dart';
1616
import '../utils/transforms.dart';
1717
import 'alert_dialog.dart';
1818
import 'animated_switcher.dart';
19-
import 'bottom_app_bar.dart';
2019
import 'audio.dart';
2120
import 'badge.dart';
22-
import 'cupertino_navigation_bar.dart';
23-
import 'cupertino_slider.dart';
24-
import 'expansion_panel.dart';
25-
import 'selection_area.dart';
2621
import 'banner.dart';
2722
import 'barchart.dart';
23+
import 'bottom_app_bar.dart';
2824
import 'bottom_sheet.dart';
2925
import 'canvas.dart';
3026
import 'card.dart';
@@ -34,6 +30,11 @@ import 'circle_avatar.dart';
3430
import 'clipboard.dart';
3531
import 'column.dart';
3632
import 'container.dart';
33+
import 'cupertino_checkbox.dart';
34+
import 'cupertino_navigation_bar.dart';
35+
import 'cupertino_radio.dart';
36+
import 'cupertino_slider.dart';
37+
import 'cupertino_switch.dart';
3738
import 'datatable.dart';
3839
import 'date_picker.dart';
3940
import 'dismissible.dart';
@@ -43,6 +44,7 @@ import 'draggable.dart';
4344
import 'dropdown.dart';
4445
import 'elevated_button.dart';
4546
import 'error.dart';
47+
import 'expansion_panel.dart';
4648
import 'expansion_tile.dart';
4749
import 'file_picker.dart';
4850
import 'flet_app_control.dart';
@@ -66,12 +68,12 @@ import 'popup_menu_button.dart';
6668
import 'progress_bar.dart';
6769
import 'progress_ring.dart';
6870
import 'radio.dart';
69-
import 'cupertino_radio.dart';
7071
import 'radio_group.dart';
7172
import 'range_slider.dart';
7273
import 'responsive_row.dart';
7374
import 'row.dart';
7475
import 'safe_area.dart';
76+
import 'selection_area.dart';
7577
import 'semantics.dart';
7678
import 'shader_mask.dart';
7779
import 'shake_detector.dart';
@@ -89,8 +91,6 @@ import 'transparent_pointer.dart';
8991
import 'vertical_divider.dart';
9092
import 'webview.dart';
9193
import 'window_drag_area.dart';
92-
import 'cupertino_checkbox.dart';
93-
import 'cupertino_switch.dart';
9494

9595
Widget createControl(Control? parent, String id, bool parentDisabled,
9696
{Widget? nextChild}) {

package/lib/src/controls/search_anchor.dart

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ class SearchAnchorControl extends StatefulWidget {
3535

3636
class _SearchAnchorControlState extends State<SearchAnchorControl> {
3737
late final SearchController _controller;
38-
String _value = "";
3938

4039
@override
4140
void initState() {
@@ -53,8 +52,13 @@ class _SearchAnchorControlState extends State<SearchAnchorControl> {
5352

5453
void _searchTextChanged() {
5554
debugPrint("_searchTextChanged: ${_controller.text}");
55+
_updateValue(_controller.text);
56+
}
57+
58+
void _updateValue(String value) {
59+
debugPrint("SearchBar.changeValue: $value");
5660
List<Map<String, String>> props = [
57-
{"i": widget.control.id, "value": _controller.text}
61+
{"i": widget.control.id, "value": value}
5862
];
5963
widget.dispatch(
6064
UpdateControlPropsAction(UpdateControlPropsPayload(props: props)));
@@ -75,8 +79,10 @@ class _SearchAnchorControlState extends State<SearchAnchorControl> {
7579
debugPrint("SearchAnchor StoreConnector build: ${widget.control.id}");
7680

7781
var value = widget.control.attrString("value");
78-
if (value != null) {
79-
_controller.text = value;
82+
if (value != null && value != _controller.text) {
83+
WidgetsBinding.instance.addPostFrameCallback((_) {
84+
_controller.text = value;
85+
});
8086
}
8187

8288
bool onChange = widget.control.attrBool("onChange", false)!;
@@ -109,39 +115,35 @@ class _SearchAnchorControlState extends State<SearchAnchorControl> {
109115
if (method != null) {
110116
debugPrint("SearchAnchor JSON method: $method");
111117

118+
void resetMethod() {
119+
List<Map<String, String>> props = [
120+
{"i": widget.control.id, "method": ""}
121+
];
122+
widget.dispatch(UpdateControlPropsAction(
123+
UpdateControlPropsPayload(props: props)));
124+
FletAppServices.of(context)
125+
.server
126+
.updateControlProps(props: props);
127+
}
128+
112129
var mj = json.decode(method);
113130
var name = mj["n"] as String;
114131
var params = Map<String, dynamic>.from(mj["p"] as Map);
115132

116133
if (name == "closeView") {
117134
WidgetsBinding.instance.addPostFrameCallback((_) {
118-
List<Map<String, String>> props = [
119-
{"i": widget.control.id, "method": ""}
120-
];
121-
widget.dispatch(UpdateControlPropsAction(
122-
UpdateControlPropsPayload(props: props)));
123-
FletAppServices.of(context)
124-
.server
125-
.updateControlProps(props: props);
135+
resetMethod();
126136
if (_controller.isOpen) {
127137
var text = params["text"].toString();
128-
setState(() {
129-
_controller.closeView(text);
130-
});
138+
_updateValue(text);
139+
_controller.closeView(text);
131140
}
132141
});
133142
} else if (name == "openView") {
134143
WidgetsBinding.instance.addPostFrameCallback((_) {
135-
List<Map<String, String>> props = [
136-
{"i": widget.control.id, "method": ""}
137-
];
138-
widget.dispatch(UpdateControlPropsAction(
139-
UpdateControlPropsPayload(props: props)));
140-
FletAppServices.of(context)
141-
.server
142-
.updateControlProps(props: props);
144+
resetMethod();
143145
if (!_controller.isOpen) {
144-
_controller.openView();
146+
_controller.openView();
145147
}
146148
});
147149
}
@@ -197,6 +199,8 @@ class _SearchAnchorControlState extends State<SearchAnchorControl> {
197199
},
198200
onSubmitted: onSubmit
199201
? (String value) {
202+
debugPrint("SearchBar.onSubmit: $value");
203+
_updateValue(value);
200204
FletAppServices.of(context).server.sendPageEvent(
201205
eventTarget: widget.control.id,
202206
eventName: "submit",
@@ -205,6 +209,8 @@ class _SearchAnchorControlState extends State<SearchAnchorControl> {
205209
: null,
206210
onChanged: onChange
207211
? (String value) {
212+
debugPrint("SearchBar.onChange: $value");
213+
_updateValue(value);
208214
FletAppServices.of(context).server.sendPageEvent(
209215
eventTarget: widget.control.id,
210216
eventName: "change",

sdk/python/packages/flet-core/src/flet_core/__init__.py

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from flet_core.animation import Animation, AnimationCurve
2020
from flet_core.app_bar import AppBar
2121
from flet_core.audio import Audio
22+
from flet_core.badge import Badge
2223
from flet_core.banner import Banner
2324
from flet_core.blur import Blur, BlurTileMode
2425
from flet_core.border import Border, BorderSide
@@ -35,7 +36,6 @@
3536
StadiumBorder,
3637
)
3738
from flet_core.card import Card
38-
from flet_core.chip import Chip
3939
from flet_core.charts.bar_chart import BarChart, BarChartEvent
4040
from flet_core.charts.bar_chart_group import BarChartGroup
4141
from flet_core.charts.bar_chart_rod import BarChartRod
@@ -56,19 +56,25 @@
5656
from flet_core.charts.pie_chart import PieChart, PieChartEvent
5757
from flet_core.charts.pie_chart_section import PieChartSection
5858
from flet_core.checkbox import Checkbox
59+
from flet_core.chip import Chip
5960
from flet_core.circle_avatar import CircleAvatar
6061
from flet_core.column import Column
6162
from flet_core.container import Container, ContainerTapEvent
6263
from flet_core.control import Control, OptionalNumber
6364
from flet_core.control_event import ControlEvent
65+
from flet_core.cupertino_checkbox import CupertinoCheckbox
66+
from flet_core.cupertino_navigation_bar import CupertinoNavigationBar
67+
from flet_core.cupertino_radio import CupertinoRadio
68+
from flet_core.cupertino_slider import CupertinoSlider
69+
from flet_core.cupertino_switch import CupertinoSwitch
6470
from flet_core.datatable import (
6571
DataCell,
6672
DataColumn,
6773
DataColumnSortEvent,
6874
DataRow,
6975
DataTable,
7076
)
71-
from flet_core.date_picker import DatePicker, DatePickerMode, DatePickerEntryMode
77+
from flet_core.date_picker import DatePicker, DatePickerEntryMode, DatePickerMode
7278
from flet_core.dismissible import Dismissible
7379
from flet_core.divider import Divider
7480
from flet_core.drag_target import DragTarget, DragTargetAcceptEvent
@@ -128,7 +134,7 @@
128134
NavigationBarLabelBehavior,
129135
NavigationDestination,
130136
)
131-
from flet_core.cupertino_navigation_bar import CupertinoNavigationBar
137+
from flet_core.navigation_drawer import NavigationDrawer, NavigationDrawerDestination
132138
from flet_core.navigation_rail import (
133139
NavigationRail,
134140
NavigationRailDestination,
@@ -158,13 +164,15 @@
158164
from flet_core.querystring import QueryString
159165
from flet_core.radio import Radio
160166
from flet_core.radio_group import RadioGroup
167+
from flet_core.range_slider import RangeSlider
161168
from flet_core.ref import Ref
162169
from flet_core.responsive_row import ResponsiveRow
163170
from flet_core.row import Row
164171
from flet_core.safe_area import SafeArea
165172
from flet_core.scrollable_control import OnScrollEvent
166-
from flet_core.search_anchor import SearchBar
173+
from flet_core.search_bar import SearchBar
167174
from flet_core.segmented_button import Segment, SegmentedButton
175+
from flet_core.selection_area import SelectionArea
168176
from flet_core.semantics import Semantics
169177
from flet_core.shader_mask import ShaderMask
170178
from flet_core.shadow import BoxShadow, ShadowBlurStyle
@@ -180,14 +188,13 @@
180188
from flet_core.text_span import TextSpan
181189
from flet_core.text_style import TextDecoration, TextDecorationStyle, TextStyle
182190
from flet_core.textfield import (
183-
KeyboardType,
184191
InputFilter,
192+
KeyboardType,
185193
NumbersOnlyInputFilter,
186194
TextCapitalization,
187195
TextField,
188196
TextOnlyInputFilter,
189197
)
190-
from flet_core.time_picker import TimePicker, TimePickerEntryMode
191198
from flet_core.theme import (
192199
ColorScheme,
193200
PageTransitionsTheme,
@@ -198,6 +205,7 @@
198205
Theme,
199206
ThemeVisualDensity,
200207
)
208+
from flet_core.time_picker import TimePicker, TimePickerEntryMode
201209
from flet_core.tooltip import Tooltip
202210
from flet_core.transform import Offset, Rotate, Scale
203211
from flet_core.transparent_pointer import TransparentPointer
@@ -223,13 +231,5 @@
223231
from flet_core.user_control import UserControl
224232
from flet_core.vertical_divider import VerticalDivider
225233
from flet_core.view import View
226-
from flet_core.window_drag_area import WindowDragArea
227234
from flet_core.webview import WebView
228-
from flet_core.range_slider import RangeSlider
229-
from flet_core.badge import Badge
230-
from flet_core.navigation_drawer import NavigationDrawer, NavigationDrawerDestination
231-
from flet_core.selection_area import SelectionArea
232-
from flet_core.cupertino_radio import CupertinoRadio
233-
from flet_core.cupertino_checkbox import CupertinoCheckbox
234-
from flet_core.cupertino_slider import CupertinoSlider
235-
from flet_core.cupertino_switch import CupertinoSwitch
235+
from flet_core.window_drag_area import WindowDragArea

sdk/python/packages/flet-core/src/flet_core/cupertino_navigation_bar.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
from typing import Any, List, Optional, Union
22

3-
from flet_core import NavigationDestination, Border
3+
from flet_core.border import Border
44
from flet_core.constrained_control import ConstrainedControl
55
from flet_core.control import OptionalNumber
6+
from flet_core.navigation_bar import NavigationDestination
67
from flet_core.ref import Ref
78
from flet_core.types import (
89
AnimationValue,

sdk/python/packages/flet-core/src/flet_core/search_anchor.py renamed to sdk/python/packages/flet-core/src/flet_core/search_bar.py

Lines changed: 10 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,21 @@
11
import time
2-
from typing import Any, Optional, Union, List, Dict
2+
from typing import Any, Dict, List, Optional, Union
33

44
from flet_core import BorderSide, OutlinedBorder
5-
from flet_core.textfield import TextCapitalization
65
from flet_core.constrained_control import ConstrainedControl
76
from flet_core.control import Control, OptionalNumber
87
from flet_core.ref import Ref
98
from flet_core.text_style import TextStyle
9+
from flet_core.textfield import TextCapitalization
1010
from flet_core.types import (
1111
AnimationValue,
12+
MaterialState,
1213
OffsetValue,
1314
ResponsiveNumber,
1415
RotateValue,
1516
ScaleValue,
16-
MaterialState,
1717
)
1818

19-
try:
20-
from typing import Literal
21-
except ImportError:
22-
from typing_extensions import Literal
23-
2419

2520
class SearchBar(ConstrainedControl):
2621
"""
@@ -180,14 +175,15 @@ async def open_view_async(self):
180175
"p": {},
181176
}
182177
self._set_attr_json("method", m)
183-
await self.update()
178+
await self.update_async()
184179

185180
def close_view(self, text: str = ""):
186181
m = {
187182
"n": "closeView",
188183
"i": str(time.time()),
189184
"p": {"text": text},
190185
}
186+
self.value = text
191187
self._set_attr_json("method", m)
192188
self.update()
193189

@@ -197,8 +193,9 @@ async def close_view_async(self, text: str = ""):
197193
"i": str(time.time()),
198194
"p": {"text": text},
199195
}
196+
self.value = text
200197
self._set_attr_json("method", m)
201-
await self.update()
198+
await self.update_async()
202199

203200
# bar_leading
204201
@property
@@ -383,10 +380,7 @@ def on_change(self):
383380
@on_change.setter
384381
def on_change(self, handler):
385382
self._add_event_handler("change", handler)
386-
if handler is not None:
387-
self._set_attr("onchange", True)
388-
else:
389-
self._set_attr("onchange", None)
383+
self._set_attr("onchange", True if handler is not None else None)
390384

391385
# on_tap
392386
@property
@@ -396,10 +390,7 @@ def on_tap(self):
396390
@on_tap.setter
397391
def on_tap(self, handler):
398392
self._add_event_handler("tap", handler)
399-
if handler is not None:
400-
self._set_attr("ontap", True)
401-
else:
402-
self._set_attr("ontap", None)
393+
self._set_attr("ontap", True if handler is not None else None)
403394

404395
# on_submit
405396
@property
@@ -409,7 +400,4 @@ def on_submit(self):
409400
@on_submit.setter
410401
def on_submit(self, handler):
411402
self._add_event_handler("submit", handler)
412-
if handler is not None:
413-
self._set_attr("onsubmit", True)
414-
else:
415-
self._set_attr("onsubmit", None)
403+
self._set_attr("onsubmit", True if handler is not None else None)

0 commit comments

Comments
 (0)