Skip to content

Commit aa184df

Browse files
authored
Merge pull request #6 from flet-dev/main
Merge changes
2 parents 2fd06ef + 1ad0cfa commit aa184df

16 files changed

+1062
-31
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# Flet changelog
22

3+
# 0.17.0
4+
5+
* `SearchBar` control ([#2212](https://github.com/flet-dev/flet/issues/2212)).
6+
* `CupertinoNavigationBar` control ([#2241](https://github.com/flet-dev/flet/issues/2241)).
7+
38
# 0.16.0
49

510
* `CupertinoSlider` control and `Slider.adaptive` ([#2224](https://github.com/flet-dev/flet/issues/2224)).

client/ios/Podfile.lock

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,15 +97,15 @@ SPEC CHECKSUMS:
9797
audioplayers_darwin: 877d9a4d06331c5c374595e46e16453ac7eafa40
9898
DKImagePickerController: b512c28220a2b8ac7419f21c491fc8534b7601ac
9999
DKPhotoGallery: fdfad5125a9fdda9cc57df834d49df790dbb4179
100-
file_picker: ce3938a0df3cc1ef404671531facef740d03f920
100+
file_picker: 15fd9539e4eb735dc54bae8c0534a7a9511a03de
101101
Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854
102102
integration_test: 13825b8a9334a850581300559b8839134b124670
103103
path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943
104104
SDWebImage: 72f86271a6f3139cc7e4a89220946489d4b9a866
105105
sensors_plus: 5717760720f7e6acd96fdbd75b7428f5ad755ec2
106106
shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126
107107
SwiftyGif: 6c3eafd0ce693cad58bb63d2b2fb9bacb8552780
108-
url_launcher_ios: 08a3dfac5fb39e8759aeb0abbd5d9480f30fc8b4
108+
url_launcher_ios: bf5ce03e0e2088bad9cc378ea97fa0ed5b49673b
109109
webview_flutter_wkwebview: 2e2d318f21a5e036e2c3f26171342e95908bd60a
110110

111111
PODFILE CHECKSUM: ef19549a9bc3046e7bb7d2fab4d021637c0c58a3

client/pubspec.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ packages:
183183
path: "../package"
184184
relative: true
185185
source: path
186-
version: "0.16.0"
186+
version: "0.17.0"
187187
flutter:
188188
dependency: "direct main"
189189
description: flutter

package/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
# 0.17.0
2+
3+
* `SearchBar` control ([#2212](https://github.com/flet-dev/flet/issues/2212)).
4+
* `CupertinoNavigationBar` control ([#2241](https://github.com/flet-dev/flet/issues/2241)).
5+
16
# 0.16.0
27

38
* `CupertinoSlider` control and `Slider.adaptive` ([#2224](https://github.com/flet-dev/flet/issues/2224)).

package/lib/src/controls/create_control.dart

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'dart:math';
22

33
import 'package:collection/collection.dart';
4+
import 'package:flet/src/controls/search_anchor.dart';
45
import 'package:flet/src/controls/segmented_button.dart';
56
import 'package:flutter/material.dart';
67
import 'package:flutter_redux/flutter_redux.dart';
@@ -15,14 +16,11 @@ import '../utils/theme.dart';
1516
import '../utils/transforms.dart';
1617
import 'alert_dialog.dart';
1718
import 'animated_switcher.dart';
18-
import 'bottom_app_bar.dart';
1919
import 'audio.dart';
2020
import 'badge.dart';
21-
import 'cupertino_slider.dart';
22-
import 'expansion_panel.dart';
23-
import 'selection_area.dart';
2421
import 'banner.dart';
2522
import 'barchart.dart';
23+
import 'bottom_app_bar.dart';
2624
import 'bottom_sheet.dart';
2725
import 'canvas.dart';
2826
import 'card.dart';
@@ -32,6 +30,11 @@ import 'circle_avatar.dart';
3230
import 'clipboard.dart';
3331
import 'column.dart';
3432
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';
3538
import 'datatable.dart';
3639
import 'date_picker.dart';
3740
import 'dismissible.dart';
@@ -41,6 +44,7 @@ import 'draggable.dart';
4144
import 'dropdown.dart';
4245
import 'elevated_button.dart';
4346
import 'error.dart';
47+
import 'expansion_panel.dart';
4448
import 'expansion_tile.dart';
4549
import 'file_picker.dart';
4650
import 'flet_app_control.dart';
@@ -64,12 +68,12 @@ import 'popup_menu_button.dart';
6468
import 'progress_bar.dart';
6569
import 'progress_ring.dart';
6670
import 'radio.dart';
67-
import 'cupertino_radio.dart';
6871
import 'radio_group.dart';
6972
import 'range_slider.dart';
7073
import 'responsive_row.dart';
7174
import 'row.dart';
7275
import 'safe_area.dart';
76+
import 'selection_area.dart';
7377
import 'semantics.dart';
7478
import 'shader_mask.dart';
7579
import 'shake_detector.dart';
@@ -87,8 +91,6 @@ import 'transparent_pointer.dart';
8791
import 'vertical_divider.dart';
8892
import 'webview.dart';
8993
import 'window_drag_area.dart';
90-
import 'cupertino_checkbox.dart';
91-
import 'cupertino_switch.dart';
9294

9395
Widget createControl(Control? parent, String id, bool parentDisabled,
9496
{Widget? nextChild}) {
@@ -483,6 +485,14 @@ Widget createWidget(Key? key, ControlViewModel controlView, Control? parent,
483485
control: controlView.control,
484486
children: controlView.children,
485487
parentDisabled: parentDisabled);
488+
case "searchbar":
489+
return SearchAnchorControl(
490+
key: key,
491+
parent: parent,
492+
control: controlView.control,
493+
children: controlView.children,
494+
parentDisabled: parentDisabled,
495+
dispatch: controlView.dispatch);
486496
case "checkbox":
487497
return CheckboxControl(
488498
key: key,
@@ -621,6 +631,13 @@ Widget createWidget(Key? key, ControlViewModel controlView, Control? parent,
621631
children: controlView.children,
622632
parentDisabled: parentDisabled,
623633
dispatch: controlView.dispatch);
634+
case "cupertinonavigationbar":
635+
return CupertinoNavigationBarControl(
636+
parent: parent,
637+
control: controlView.control,
638+
children: controlView.children,
639+
parentDisabled: parentDisabled,
640+
dispatch: controlView.dispatch);
624641
case "bottomappbar":
625642
return BottomAppBarControl(
626643
parent: parent,
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
import 'package:collection/collection.dart';
2+
import 'package:flutter/cupertino.dart';
3+
import 'package:flutter/material.dart';
4+
import 'package:flutter_redux/flutter_redux.dart';
5+
6+
import '../actions.dart';
7+
import '../flet_app_services.dart';
8+
import '../models/app_state.dart';
9+
import '../models/control.dart';
10+
import '../models/controls_view_model.dart';
11+
import '../protocol/update_control_props_payload.dart';
12+
import '../utils/colors.dart';
13+
import '../utils/icons.dart';
14+
import 'create_control.dart';
15+
import '../utils/borders.dart';
16+
17+
class CupertinoNavigationBarControl extends StatefulWidget {
18+
final Control? parent;
19+
final Control control;
20+
final List<Control> children;
21+
final bool parentDisabled;
22+
final dynamic dispatch;
23+
24+
const CupertinoNavigationBarControl(
25+
{Key? key,
26+
this.parent,
27+
required this.control,
28+
required this.children,
29+
required this.parentDisabled,
30+
required this.dispatch})
31+
: super(key: key);
32+
33+
@override
34+
State<CupertinoNavigationBarControl> createState() =>
35+
_CupertinoNavigationBarControlState();
36+
}
37+
38+
class _CupertinoNavigationBarControlState
39+
extends State<CupertinoNavigationBarControl> {
40+
int _selectedIndex = 0;
41+
42+
void _onTap(int index) {
43+
_selectedIndex = index;
44+
debugPrint("Selected index: $_selectedIndex");
45+
List<Map<String, String>> props = [
46+
{"i": widget.control.id, "selectedindex": _selectedIndex.toString()}
47+
];
48+
widget.dispatch(
49+
UpdateControlPropsAction(UpdateControlPropsPayload(props: props)));
50+
final server = FletAppServices.of(context).server;
51+
server.updateControlProps(props: props);
52+
server.sendPageEvent(
53+
eventTarget: widget.control.id,
54+
eventName: "change",
55+
eventData: _selectedIndex.toString());
56+
}
57+
58+
@override
59+
Widget build(BuildContext context) {
60+
debugPrint("CupertinoNavigationBarControl build: ${widget.control.id}");
61+
62+
bool disabled = widget.control.isDisabled || widget.parentDisabled;
63+
var selectedIndex = widget.control.attrInt("selectedIndex", 0)!;
64+
65+
if (_selectedIndex != selectedIndex) {
66+
_selectedIndex = selectedIndex;
67+
}
68+
69+
var navBar = StoreConnector<AppState, ControlsViewModel>(
70+
distinct: true,
71+
converter: (store) => ControlsViewModel.fromStore(
72+
store,
73+
widget.children
74+
.where((c) => c.isVisible && c.name == null)
75+
.map((c) => c.id)),
76+
builder: (content, viewModel) {
77+
return CupertinoTabBar(
78+
backgroundColor: HexColor.fromString(
79+
Theme.of(context), widget.control.attrString("bgColor", "")!),
80+
activeColor: HexColor.fromString(
81+
Theme.of(context), widget.control.attrString("activeColor", "")!),
82+
inactiveColor: HexColor.fromString(Theme.of(context),
83+
widget.control.attrString("inactiveColor", "")!) ?? CupertinoColors.inactiveGray,
84+
iconSize: widget.control.attrDouble("iconSize", 30.0)!,
85+
currentIndex: _selectedIndex,
86+
border: parseBorder(Theme.of(context), widget.control, "border"),
87+
onTap: _onTap,
88+
items: viewModel.controlViews.map((destView) {
89+
var label = destView.control.attrString("label", "")!;
90+
91+
var icon =
92+
getMaterialIcon(destView.control.attrString("icon", "")!);
93+
var iconContentCtrls =
94+
destView.children.where((c) => c.name == "icon_content");
95+
96+
var selectedIcon = getMaterialIcon(
97+
destView.control.attrString("selectedIcon", "")!);
98+
var selectedIconContentCtrls = destView.children
99+
.where((c) => c.name == "selected_icon_content");
100+
101+
return BottomNavigationBarItem(
102+
tooltip: destView.control.attrString("tooltip", "")!,
103+
icon: iconContentCtrls.isNotEmpty
104+
? createControl(destView.control,
105+
iconContentCtrls.first.id, disabled)
106+
: Icon(icon),
107+
activeIcon: selectedIconContentCtrls.isNotEmpty
108+
? createControl(destView.control,
109+
selectedIconContentCtrls.first.id, disabled)
110+
: selectedIcon != null
111+
? Icon(selectedIcon)
112+
: null,
113+
label: label);
114+
}).toList());
115+
});
116+
117+
return constrainedControl(context, navBar, widget.parent, widget.control);
118+
}
119+
}

package/lib/src/controls/navigation_bar.dart

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import 'package:collection/collection.dart';
2+
import 'package:flutter/foundation.dart';
23
import 'package:flutter/material.dart';
34
import 'package:flutter_redux/flutter_redux.dart';
45

@@ -12,6 +13,7 @@ import '../utils/colors.dart';
1213
import '../utils/icons.dart';
1314
import 'create_control.dart';
1415
import '../utils/borders.dart';
16+
import 'cupertino_navigation_bar.dart';
1517

1618
class NavigationBarControl extends StatefulWidget {
1719
final Control? parent;
@@ -56,6 +58,17 @@ class _NavigationBarControlState extends State<NavigationBarControl> {
5658
Widget build(BuildContext context) {
5759
debugPrint("NavigationBarControl build: ${widget.control.id}");
5860

61+
bool adaptive = widget.control.attrBool("adaptive", false)!;
62+
if (adaptive &&
63+
(defaultTargetPlatform == TargetPlatform.iOS ||
64+
defaultTargetPlatform == TargetPlatform.macOS)) {
65+
return CupertinoNavigationBarControl(
66+
control: widget.control,
67+
children: widget.children,
68+
parentDisabled: widget.parentDisabled,
69+
dispatch: widget.dispatch);
70+
}
71+
5972
bool disabled = widget.control.isDisabled || widget.parentDisabled;
6073
var selectedIndex = widget.control.attrInt("selectedIndex", 0)!;
6174

package/lib/src/controls/page.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -655,7 +655,7 @@ class _ViewControlState extends State<ViewControl> {
655655
} else if (ctrl.type == "floatingactionbutton") {
656656
fab = ctrl;
657657
continue;
658-
} else if (ctrl.type == "navigationbar") {
658+
} else if (ctrl.type == "navigationbar" || ctrl.type == "cupertinonavigationbar" ) {
659659
navBar = ctrl;
660660
continue;
661661
} else if (ctrl.type == "navigationdrawer" &&

0 commit comments

Comments
 (0)