Skip to content

Commit 5247c96

Browse files
committed
add Snaps to bottom sheets
1 parent 724e5db commit 5247c96

File tree

5 files changed

+23
-4
lines changed

5 files changed

+23
-4
lines changed

integration_test/local/dialog_test.dart integration_test/local/dialogsAndToast_test.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import '../framework/test_helper.dart';
88
void main() {
99
late EnsembleConfig config;
1010
setUpAll(() async {
11-
config = await TestHelper.setupApp(appName: 'dialog');
11+
config = await TestHelper.setupApp(appName: 'dialogsAndToast');
1212
});
1313

1414
group('Testing Toast', () {

lib/action/bottom_sheet_actions.dart

+17
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import 'package:collection/collection.dart';
12
import 'package:ensemble/framework/action.dart';
23
import 'package:ensemble/framework/data_context.dart';
34
import 'package:ensemble/framework/error_handling.dart';
@@ -85,6 +86,14 @@ class ShowBottomSheetAction extends EnsembleAction {
8586
min: 0,
8687
max: 1);
8788

89+
bool isSnap(scopeManager) =>
90+
Utils.optionalBool(
91+
eval(payload["scrollOptions"]?["snap"], scopeManager)) ??
92+
false;
93+
94+
List<double>? additionalSnaps(scopeManager) => Utils.getList<double>(
95+
eval(payload["scrollOptions"]?["additionalViewportSnaps"], scopeManager));
96+
8897
@override
8998
Future<dynamic> execute(BuildContext context, ScopeManager scopeManager) {
9099
if (body != null) {
@@ -140,6 +149,12 @@ class ShowBottomSheetAction extends EnsembleAction {
140149
initialViewport = (minViewport + maxViewport) / 2.0;
141150
}
142151

152+
bool useSnap = isSnap(scopeManager);
153+
List<double>? snaps = additionalSnaps(scopeManager)
154+
?.where((item) => item > minViewport && item < maxViewport)
155+
.toList();
156+
snaps?.sort();
157+
143158
// On platforms with a mouse (Web/desktop), there is no min/maxViewport due to platform consistency,
144159
// so the height will be fixed to initialViewport, and content will just scroll within it.
145160
// https://docs.flutter.dev/release/breaking-changes/default-scroll-behavior-drag
@@ -148,6 +163,8 @@ class ShowBottomSheetAction extends EnsembleAction {
148163
minChildSize: minViewport,
149164
maxChildSize: maxViewport,
150165
initialChildSize: initialViewport,
166+
snap: useSnap,
167+
snapSizes: useSnap ? snaps : null,
151168
builder: (context, scrollController) =>
152169
buildRootContainer(scopeManager, context,
153170
child: SingleChildScrollView(

lib/util/utils.dart

+4-2
Original file line numberDiff line numberDiff line change
@@ -261,10 +261,12 @@ class Utils {
261261
}
262262

263263
static List<T>? getList<T>(dynamic value) {
264-
if (value is YamlList) {
264+
if (value is List) {
265265
List<T> results = [];
266266
for (var item in value) {
267-
results.add(item);
267+
if (item is T) {
268+
results.add(item);
269+
}
268270
}
269271
return results;
270272
}

pubspec.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ flutter:
152152
# integration tests (TODO - exclude from build)
153153
- integration_test/local/defaultApp/
154154
- integration_test/local/themedApp/
155-
- integration_test/local/dialog/
155+
- integration_test/local/dialogsAndToast/
156156

157157
fonts:
158158
# icon fonts

0 commit comments

Comments
 (0)