Skip to content

Commit b397650

Browse files
committed
Tabs selected_index
1 parent d2f5dfa commit b397650

File tree

5 files changed

+31
-66
lines changed

5 files changed

+31
-66
lines changed

client/lib/controls/navigation_rail.dart

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,8 @@ class _NavigationRailControlState extends State<NavigationRailControl> {
5858
Widget build(BuildContext context) {
5959
debugPrint("NavigationRailControl build: ${widget.control.id}");
6060

61-
var selectedIndex = widget.control.attrInt("selectedIndex");
62-
63-
debugPrint(selectedIndex.toString());
64-
6561
bool disabled = widget.control.isDisabled || widget.parentDisabled;
62+
var selectedIndex = widget.control.attrInt("selectedIndex");
6663

6764
if (_selectedIndex != selectedIndex) {
6865
_selectedIndex = selectedIndex;

client/lib/controls/tabs.dart

Lines changed: 16 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -31,16 +31,14 @@ class TabsControl extends StatefulWidget {
3131
class _TabsControlState extends State<TabsControl>
3232
with TickerProviderStateMixin {
3333
List<String> _tabsIndex = [];
34-
String? _value;
3534
TabController? _tabController;
35+
int _selectedIndex = 0;
3636
dynamic _dispatch;
3737

3838
@override
3939
void initState() {
4040
super.initState();
41-
_tabsIndex = widget.children
42-
.map((c) => c.attrString("key") ?? c.attrString("text", "")!)
43-
.toList();
41+
_tabsIndex = widget.children.map((c) => c.id).toList();
4442
_tabController = TabController(
4543
length: _tabsIndex.length,
4644
animationDuration: Duration(
@@ -53,34 +51,31 @@ class _TabsControlState extends State<TabsControl>
5351
if (_tabController!.indexIsChanging == true) {
5452
return;
5553
}
56-
var value = _tabsIndex[_tabController!.index];
57-
if (_value != value) {
58-
debugPrint("Selected tab: $value");
54+
var index = _tabController!.index;
55+
if (_selectedIndex != index) {
56+
debugPrint("Selected index: $index");
5957
List<Map<String, String>> props = [
60-
{"i": widget.control.id, "value": value}
58+
{"i": widget.control.id, "selectedindex": index.toString()}
6159
];
6260
_dispatch(
6361
UpdateControlPropsAction(UpdateControlPropsPayload(props: props)));
6462
ws.updateControlProps(props: props);
6563
ws.pageEventFromWeb(
6664
eventTarget: widget.control.id,
6765
eventName: "change",
68-
eventData: value);
66+
eventData: index.toString());
67+
_selectedIndex = index;
6968
}
70-
_value = value;
7169
}
7270

7371
@override
7472
Widget build(BuildContext context) {
7573
debugPrint("TabsControl build: ${widget.control.id}");
7674

77-
var tabsIndex = widget.children
78-
.map((c) => c.attrString("key") ?? c.attrString("text", "")!)
79-
.toList();
75+
var tabsIndex = widget.children.map((c) => c.id).toList();
8076
if (tabsIndex.length != _tabsIndex.length ||
8177
!tabsIndex.every((item) => _tabsIndex.contains(item))) {
82-
_tabsIndex =
83-
widget.children.map((c) => c.attrString("key", "")!).toList();
78+
_tabsIndex = tabsIndex;
8479
_tabController = TabController(
8580
length: _tabsIndex.length,
8681
animationDuration: Duration(
@@ -91,14 +86,13 @@ class _TabsControlState extends State<TabsControl>
9186

9287
bool disabled = widget.control.isDisabled || widget.parentDisabled;
9388

94-
String? value = widget.control.attrString("value");
95-
if (_value != value) {
96-
_value = value;
89+
var selectedIndex = widget.control.attrInt("selectedIndex", 0)!;
9790

98-
int idx = _tabsIndex.indexOf(_value ?? "");
99-
if (idx != -1) {
100-
_tabController!.index = idx;
101-
}
91+
if (selectedIndex > -1 &&
92+
selectedIndex < tabsIndex.length &&
93+
_selectedIndex != selectedIndex) {
94+
_selectedIndex = selectedIndex;
95+
_tabController!.index = selectedIndex;
10296
}
10397

10498
var tabs = StoreConnector<AppState, ControlsViewModel>(

sdk/python/flet/tabs.py

Lines changed: 8 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,9 @@ def __init__(
1515
content: Control = None,
1616
tab_content: Control = None,
1717
ref: Ref = None,
18-
key: str = None,
1918
icon: str = None,
2019
):
2120
Control.__init__(self, ref=ref)
22-
assert key or text, "key or text must be specified"
23-
self.key = key
2421
self.text = text
2522
self.icon = icon
2623
self.__content: Control = None
@@ -41,15 +38,6 @@ def _get_children(self):
4138
children.append(self.__content)
4239
return children
4340

44-
# key
45-
@property
46-
def key(self):
47-
return self._get_attr("key")
48-
49-
@key.setter
50-
def key(self, value):
51-
self._set_attr("key", value)
52-
5341
# text
5442
@property
5543
def text(self):
@@ -101,7 +89,7 @@ def __init__(
10189
#
10290
# Tabs-specific
10391
tabs: List[Tab] = None,
104-
value: str = None,
92+
selected_index: int = None,
10593
animation_duration: int = None,
10694
on_change=None,
10795
):
@@ -119,7 +107,7 @@ def __init__(
119107
)
120108

121109
self.tabs = tabs
122-
self.value = value
110+
self.selected_index = selected_index
123111
self.animation_duration = animation_duration
124112
self.on_change = on_change
125113

@@ -139,7 +127,6 @@ def tabs(self):
139127
def tabs(self, value: Optional[List[Tab]]):
140128
value = value or []
141129
self.__tabs = value
142-
self.value = value and (value[0].key or value[0].text) or ""
143130

144131
# on_change
145132
@property
@@ -150,23 +137,15 @@ def on_change(self):
150137
def on_change(self, handler):
151138
self._add_event_handler("change", handler)
152139

153-
# value
140+
# selected_index
154141
@property
155-
def value(self):
156-
return self._get_attr("value")
142+
def selected_index(self):
143+
return self._get_attr("selectedIndex", data_type="int", def_value=0)
157144

158-
@value.setter
145+
@selected_index.setter
159146
@beartype
160-
def value(self, value: Optional[str]):
161-
if not value:
162-
assert (
163-
not self.tabs
164-
), "Setting an empty value is only allowed if you have no tabs"
165-
else:
166-
assert any(
167-
value in keys for keys in [(tab.key, tab.text) for tab in self.tabs]
168-
), f"'{value}' is not a key for any tab"
169-
self._set_attr("value", value or "")
147+
def selected_index(self, value: Optional[int]):
148+
self._set_attr("selectedIndex", value)
170149

171150
# animation_duration
172151
@property

sdk/python/playground/tabs-test.py

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,23 +12,20 @@ def main(page: Page):
1212
page.title = "Tabs example"
1313

1414
t = Tabs(
15-
value="tab2",
15+
selected_index=1,
1616
animation_duration=300,
1717
tabs=[
1818
Tab(
19-
key="tab1",
2019
text="Tab 1",
2120
content=Container(
2221
content=Text("This is Tab 1"), alignment=alignment.center
2322
),
2423
),
2524
Tab(
26-
key="tab2",
2725
tab_content=Icon(icons.MESSAGE),
2826
content=Text("This is Tab 2"),
2927
),
3028
Tab(
31-
key="tab3",
3229
text="Tab 3",
3330
icon=icons.IRON,
3431
content=Text("This is Tab 3"),
@@ -39,14 +36,14 @@ def main(page: Page):
3936

4037
page.add(t)
4138

42-
sleep(3)
43-
t.value = "tab3"
39+
sleep(7)
40+
t.selected_index = 2
4441
page.update()
4542
sleep(3)
46-
t.value = "tab1"
43+
t.selected_index = 0
4744
page.update()
4845
sleep(3)
49-
t.value = "tab2"
46+
t.selected_index = 1
5047
t.tabs.pop(0)
5148
t.tabs[1].content = Text("Blah blah blah")
5249
page.update()
@@ -56,15 +53,13 @@ def main(page: Page):
5653
sleep(3)
5754
t.tabs.append(
5855
Tab(
59-
key="tab4",
6056
text="Tab 4",
6157
icon=icons.LOCK,
6258
content=Text("This is Tab 4"),
6359
)
6460
)
6561
t.tabs.append(
6662
Tab(
67-
key="tab5",
6863
text="Tab 5",
6964
icon=icons.SIP_SHARP,
7065
content=Text("This is Tab 5"),

sdk/python/playground/todo.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ def __init__(self):
9292
self.new_task = TextField(hint_text="Whats needs to be done?", expand=True)
9393
self.tasks_view = Column()
9494
self.filter = Tabs(
95-
value="all",
95+
selected_index="all",
9696
on_change=self.tabs_changed,
9797
tabs=[Tab(text="all"), Tab(text="active"), Tab(text="completed")],
9898
)

0 commit comments

Comments
 (0)