Skip to content

Commit a47f0e0

Browse files
committed
Merge branch 'biometric' of github.com:EnsembleUI/ensemble into biometric
2 parents 9b5d9b5 + 00e8e65 commit a47f0e0

13 files changed

+196
-83
lines changed

lib/action/biometric_auth_action.dart

+6-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import 'package:ensemble/framework/action.dart';
44
import 'package:ensemble/framework/scope.dart';
55
import 'package:ensemble/screen_controller.dart';
66
import 'package:ensemble/util/utils.dart';
7+
import 'package:flutter/foundation.dart';
78
import 'package:flutter/services.dart';
89
import 'package:flutter/src/widgets/framework.dart';
910
import 'package:local_auth/local_auth.dart';
@@ -32,6 +33,10 @@ class AuthenticateByBiometric extends EnsembleAction {
3233

3334
@override
3435
Future execute(BuildContext context, ScopeManager scopeManager) async {
36+
if (kIsWeb) {
37+
print('authenticateByBiometric only works on native device');
38+
return;
39+
}
3540
try {
3641
final LocalAuthentication auth = LocalAuthentication();
3742

@@ -79,7 +84,7 @@ class AuthenticateByBiometric extends EnsembleAction {
7984

8085
static EnsembleAction? fromMap({Map? payload}) {
8186
if (payload == null || payload['onAuthenticated'] == null) {
82-
print("localAuth: onAuthenticated is required");
87+
print("authenticateByBiometric: onAuthenticated is required");
8388
return null;
8489
}
8590
return AuthenticateByBiometric(

lib/framework/menu.dart

+20-4
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,18 @@ import 'package:yaml/yaml.dart';
1010

1111
abstract class Menu extends Object with HasStyles, Invokable {
1212
Menu(this.menuItems,
13-
{Map<String, dynamic>? widgetTypeStyles,
13+
{String? widgetType,
14+
Map<String, dynamic>? widgetTypeStyles,
15+
String? widgetId,
1416
Map<String, dynamic>? idStyles,
1517
Map<String, dynamic>? inlineStyles,
1618
List<String>? classList,
1719
this.headerModel,
1820
this.footerModel,
1921
this.reloadView}) {
22+
this.widgetType = widgetType;
2023
this.widgetTypeStyles = widgetTypeStyles;
24+
this.widgetId = widgetId;
2125
this.idStyles = idStyles;
2226
this.inlineStyles = inlineStyles;
2327
this.classList = classList;
@@ -121,19 +125,23 @@ abstract class Menu extends Object with HasStyles, Invokable {
121125
final isReloadView = payload['reloadView'] as bool? ?? true;
122126
if (menuType == MenuDisplay.BottomNavBar) {
123127
return BottomNavBarMenu(menuItems,
128+
widgetType: menuType!.name,
124129
widgetTypeStyles: EnsembleThemeManager()
125130
.currentTheme()
126131
?.getWidgetTypeStyles(menuType!.name),
132+
widgetId: id,
127133
idStyles: EnsembleThemeManager().currentTheme()?.getIDStyles(id),
128134
inlineStyles: styles,
129135
classList: classList,
130136
reloadView: isReloadView);
131137
} else if (menuType == MenuDisplay.Drawer ||
132138
menuType == MenuDisplay.EndDrawer) {
133139
return DrawerMenu(menuItems, menuType != MenuDisplay.EndDrawer,
140+
widgetType: menuType!.name,
134141
widgetTypeStyles: EnsembleThemeManager()
135142
.currentTheme()
136143
?.getWidgetTypeStyles(menuType!.name),
144+
widgetId: id,
137145
idStyles: EnsembleThemeManager().currentTheme()?.getIDStyles(id),
138146
inlineStyles: styles,
139147
classList: classList,
@@ -143,9 +151,11 @@ abstract class Menu extends Object with HasStyles, Invokable {
143151
} else if (menuType == MenuDisplay.Sidebar ||
144152
menuType == MenuDisplay.EndSidebar) {
145153
return SidebarMenu(menuItems, menuType != MenuDisplay.EndSidebar,
154+
widgetType: menuType!.name,
146155
widgetTypeStyles: EnsembleThemeManager()
147156
.currentTheme()
148157
?.getWidgetTypeStyles(menuType!.name),
158+
widgetId: id,
149159
idStyles: EnsembleThemeManager().currentTheme()?.getIDStyles(id),
150160
inlineStyles: styles,
151161
classList: classList,
@@ -161,7 +171,9 @@ abstract class Menu extends Object with HasStyles, Invokable {
161171

162172
class BottomNavBarMenu extends Menu {
163173
BottomNavBarMenu(super.menuItems,
164-
{super.widgetTypeStyles,
174+
{super.widgetType,
175+
super.widgetTypeStyles,
176+
super.widgetId,
165177
super.idStyles,
166178
super.inlineStyles,
167179
super.classList,
@@ -185,7 +197,9 @@ class BottomNavBarMenu extends Menu {
185197

186198
class DrawerMenu extends Menu {
187199
DrawerMenu(super.menuItems, this.atStart,
188-
{super.widgetTypeStyles,
200+
{super.widgetType,
201+
super.widgetTypeStyles,
202+
super.widgetId,
189203
super.idStyles,
190204
super.inlineStyles,
191205
super.classList,
@@ -214,7 +228,9 @@ class DrawerMenu extends Menu {
214228

215229
class SidebarMenu extends Menu {
216230
SidebarMenu(super.menuItems, this.atStart,
217-
{super.widgetTypeStyles,
231+
{super.widgetType,
232+
super.widgetTypeStyles,
233+
super.widgetId,
218234
super.idStyles,
219235
super.inlineStyles,
220236
super.classList,

lib/framework/studio/studio_debugger.dart

+11-3
Original file line numberDiff line numberDiff line change
@@ -132,9 +132,17 @@ class StudioDebugger {
132132
}
133133

134134
Widget assertHasStackWrapper(Widget widget, BuildContext context) {
135-
RequireStackWidget? requireStackWidget =
136-
context.dependOnInheritedWidgetOfExactType<RequireStackWidget>();
137-
if (requireStackWidget == null) {
135+
bool isStack = false;
136+
context.visitAncestorElements((element) {
137+
if (element.widget.runtimeType == Stack) {
138+
isStack = true;
139+
}
140+
141+
// This will ensure that it doesnt check for any other parent widgets
142+
return false;
143+
});
144+
145+
if (!isStack) {
138146
throw LanguageError(
139147
"stackPosition* is applicable only with Stack as the parent widget",
140148
recovery:

lib/framework/theme_manager.dart

+12-4
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,9 @@ class EnsembleThemeManager {
5858
void configureStyles(
5959
DataContext dataContext, HasStyles model, HasStyles hasStyles) {
6060
//we have to set all these so we can resolve when styles change at runtime through app logic
61+
hasStyles.widgetType = model.widgetType;
6162
hasStyles.widgetTypeStyles = model.widgetTypeStyles;
63+
hasStyles.widgetId = model.widgetId;
6264
hasStyles.idStyles = model.idStyles;
6365
hasStyles.classList = model.classList;
6466
hasStyles.inlineStyles = model.inlineStyles;
@@ -233,8 +235,8 @@ class EnsembleTheme {
233235
// return inheritedStyles;
234236
}
235237

236-
Map<String, dynamic>? getWidgetTypeStyles(String widgetType) {
237-
return styles[widgetType];
238+
Map<String, dynamic>? getWidgetTypeStyles(String? widgetType) {
239+
return widgetType != null ? styles[widgetType] : null;
238240
}
239241

240242
void resolveAndApplyStyles(
@@ -246,8 +248,14 @@ class EnsembleTheme {
246248
}
247249

248250
Map<String, dynamic> resolveStyles(DataContext context, HasStyles widget) {
249-
return _resolveStyles(context, widget.styleOverrides, widget.inlineStyles,
250-
widget.idStyles, widget.classList, widget.widgetTypeStyles, null);
251+
return _resolveStyles(
252+
context,
253+
widget.styleOverrides,
254+
widget.inlineStyles,
255+
getIDStyles(widget.widgetId),
256+
widget.classList,
257+
getWidgetTypeStyles(widget.widgetType),
258+
null);
251259
}
252260

253261
///classList is a list of class names

lib/layout/box/base_box_layout.dart

+8-2
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,7 @@ class FittedBoxLayoutController extends BaseBoxLayoutController {
6868
}
6969

7070
/// controller for Column/Row/Flex
71-
class BoxLayoutController extends BaseBoxLayoutController
72-
with HasPullToRefresh {
71+
class BoxLayoutController extends BaseBoxLayoutController {
7372
ItemTemplate? itemTemplate;
7473

7574
bool scrollable = false;
@@ -80,6 +79,13 @@ class BoxLayoutController extends BaseBoxLayoutController
8079
// applicable to Flex container only
8180
String? direction;
8281

82+
// applicable for Column only
83+
PullToRefresh? pullToRefresh;
84+
@Deprecated("use pullToRefresh")
85+
EnsembleAction? onPullToRefresh;
86+
@Deprecated("use pullToRefresh")
87+
PullToRefreshOptions? pullToRefreshOptions;
88+
8389
@override
8490
Map<String, Function> getBaseSetters() {
8591
Map<String, Function> setters = super.getBaseSetters();

lib/layout/box/box_layout.dart

+27-24
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,8 @@
1-
import 'dart:developer';
2-
31
import 'package:ensemble/framework/action.dart';
42
import 'package:ensemble/framework/error_handling.dart';
53
import 'package:ensemble/framework/event.dart';
6-
import 'package:ensemble/framework/extensions.dart';
74
import 'package:ensemble/framework/studio/studio_debugger.dart';
85
import 'package:ensemble/framework/view/footer.dart';
9-
import 'package:ensemble/framework/view/page_group.dart';
106
import 'package:ensemble/framework/widget/has_children.dart';
117
import 'package:ensemble/framework/widget/view_util.dart';
128
import 'package:ensemble/framework/widget/widget.dart';
@@ -15,24 +11,18 @@ import 'package:ensemble/layout/templated.dart';
1511
import 'package:ensemble/model/pull_to_refresh.dart';
1612
import 'package:ensemble/page_model.dart';
1713
import 'package:ensemble/screen_controller.dart';
18-
import 'package:ensemble/util/layout_utils.dart';
1914
import 'package:ensemble/util/utils.dart';
20-
import 'package:ensemble/framework/theme/theme_manager.dart';
21-
import 'package:ensemble/widget/carousel.dart';
2215
import 'package:ensemble/widget/helpers/pull_to_refresh_container.dart';
23-
import 'package:ensemble/widget/helpers/widgets.dart';
2416
import 'package:ensemble_ts_interpreter/invokables/invokable.dart';
2517
import 'package:flutter/cupertino.dart';
2618
import 'package:flutter/foundation.dart';
2719
import 'package:flutter/material.dart' as flutter;
28-
import 'package:ensemble/util/platform.dart';
2920
import 'package:flutter/material.dart';
30-
31-
import '../../widget/helpers/controllers.dart';
3221
import 'box_utils.dart';
3322

3423
class Column extends BoxLayout {
3524
static const type = 'Column';
25+
3626
Column({Key? key}) : super(key: key);
3727

3828
@override
@@ -44,6 +34,8 @@ class Column extends BoxLayout {
4434
Map<String, Function> setters() {
4535
Map<String, Function> entries = super.setters();
4636
entries.addAll({
37+
'pullToRefresh': (input) =>
38+
_controller.pullToRefresh = PullToRefresh.fromMap(input, this),
4739
'onPullToRefresh': (funcDefinition) => _controller.onPullToRefresh =
4840
EnsembleAction.fromYaml(funcDefinition, initiator: this),
4941
'pullToRefreshOptions': (input) => _controller.pullToRefreshOptions =
@@ -55,6 +47,7 @@ class Column extends BoxLayout {
5547

5648
class Row extends BoxLayout {
5749
static const type = 'Row';
50+
5851
Row({Key? key}) : super(key: key);
5952

6053
@override
@@ -65,6 +58,7 @@ class Row extends BoxLayout {
6558

6659
class Flex extends BoxLayout {
6760
static const type = 'Flex';
61+
6862
Flex({Key? key}) : super(key: key);
6963

7064
@override
@@ -98,6 +92,7 @@ abstract class BoxLayout extends StatefulWidget
9892
BoxLayout({Key? key}) : super(key: key);
9993

10094
final BoxLayoutController _controller = BoxLayoutController();
95+
10196
@override
10297
BoxLayoutController get controller => _controller;
10398

@@ -262,7 +257,8 @@ class BoxLayoutState extends WidgetState<BoxLayout>
262257
controller: widget._controller,
263258
ignoresMargin: widget is Column);
264259

265-
if (widget._controller.scrollable) {
260+
var pullToRefresh = _getPullToRefresh();
261+
if (widget._controller.scrollable || pullToRefresh != null) {
266262
FooterScope? footerScope = FooterScope.of(context);
267263
rtn = ScrollableColumn(
268264
child: SingleChildScrollView(
@@ -273,33 +269,40 @@ class BoxLayoutState extends WidgetState<BoxLayout>
273269
: null,
274270
scrollDirection:
275271
widget.isVertical() ? Axis.vertical : Axis.horizontal,
276-
physics: widget._controller.onPullToRefresh != null
272+
physics: pullToRefresh != null
277273
? const AlwaysScrollableScrollPhysics()
278274
: null,
279275
child: rtn),
280276
);
281277

282-
if (widget is Column && widget._controller.onPullToRefresh != null) {
283-
rtn = PullToRefreshContainer(
284-
options: widget._controller.pullToRefreshOptions,
285-
onRefresh: _pullToRefresh,
286-
contentWidget: rtn);
278+
if (widget is Column && pullToRefresh != null) {
279+
rtn =
280+
PullToRefreshContainer(options: pullToRefresh, contentWidget: rtn);
287281
}
288282
}
289283

290-
// for Column we add margin at the end, just in case it is inside a Scrollable or PulltoRefresh
284+
// for Column we add margin at the end, just in case it is inside a Scrollable or PullToRefresh
291285
if (widget is Column && widget._controller.margin != null) {
292286
rtn = Padding(padding: widget._controller.margin!, child: rtn);
293287
}
294288

295289
return rtn;
296290
}
297291

298-
Future<void> _pullToRefresh() async {
299-
if (widget._controller.onPullToRefresh != null) {
300-
await ScreenController()
301-
.executeAction(context, widget._controller.onPullToRefresh!);
302-
}
292+
// backward compatible
293+
PullToRefresh? _getPullToRefresh() {
294+
return widget._controller.pullToRefresh ??
295+
(widget._controller.onPullToRefresh != null
296+
? PullToRefresh(
297+
widget._controller.onPullToRefresh!,
298+
indicatorType:
299+
widget._controller.pullToRefreshOptions?.indicatorType,
300+
indicatorMinDuration: widget
301+
._controller.pullToRefreshOptions?.indicatorMinDuration,
302+
indicatorPadding:
303+
widget._controller.pullToRefreshOptions?.indicatorPadding,
304+
)
305+
: null);
303306
}
304307

305308
void _onItemTap(int index) {

0 commit comments

Comments
 (0)