From e7fe3758aec2ce35c7bca9967892a1675a6c7c61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nemanja=20Mladenovic=CC=81?= Date: Thu, 25 Apr 2024 14:12:51 +0200 Subject: [PATCH 1/7] - Added Material Slider widget - Added tests --- .../rfw/lib/src/flutter/material_widgets.dart | 34 ++++++++ packages/rfw/pubspec.yaml | 2 +- packages/rfw/test/material_widgets_test.dart | 78 +++++++++++++++++++ packages/rfw/test/utils.dart | 14 ++++ 4 files changed, 127 insertions(+), 1 deletion(-) diff --git a/packages/rfw/lib/src/flutter/material_widgets.dart b/packages/rfw/lib/src/flutter/material_widgets.dart index 1ddd71ad7e65..fc1db065e01b 100644 --- a/packages/rfw/lib/src/flutter/material_widgets.dart +++ b/packages/rfw/lib/src/flutter/material_widgets.dart @@ -37,6 +37,7 @@ import 'runtime.dart'; /// * [Material] /// * [OutlinedButton] /// * [Scaffold] +/// * [Slider] /// * [TextButton] /// * [VerticalDivider] /// * [OverflowBar] @@ -499,6 +500,39 @@ Map get _materialWidgetsDefinitions => (['min']) ?? 0.0; + final value = source.v(['value']) ?? min; + final labelText = source.v(['label']); + final label = labelText != null ? '$labelText:${value.toStringAsFixed(2)}' : value.toStringAsFixed(2); + return Slider( + value: value, + secondaryTrackValue: source.v(['secondaryTrackValue']), + onChanged: source.handler(['onChanged'], + (HandlerTrigger trigger) => (double value) { + trigger({'value': value}); + }), + onChangeStart: source.handler(['onChangeStart'], + (HandlerTrigger trigger) => (double value) { + trigger({'value': value}); + }), + onChangeEnd: source.handler(['onChangeEnd'], + (HandlerTrigger trigger) => (double value) { + trigger({'value': value}); + }), + min: min, + max: source.v(['max']) ?? 1.0, + divisions: source.v(['divisions']), + label: label, + activeColor: ArgumentDecoders.color(source, ['activeColor']), + inactiveColor: ArgumentDecoders.color(source, ['inactiveColor']), + secondaryActiveColor: ArgumentDecoders.color(source, ['secondaryActiveColor']), + thumbColor: ArgumentDecoders.color(source, ['thumbColor']), + allowedInteraction: ArgumentDecoders.enumValue(SliderInteraction.values, source, ['allowedInteraction']), + ); + }, + 'TextButton': (BuildContext context, DataSource source) { // not implemented: buttonStyle, focusNode return TextButton( diff --git a/packages/rfw/pubspec.yaml b/packages/rfw/pubspec.yaml index a83be027aafe..046fe7a19274 100644 --- a/packages/rfw/pubspec.yaml +++ b/packages/rfw/pubspec.yaml @@ -2,7 +2,7 @@ name: rfw description: "Remote Flutter widgets: a library for rendering declarative widget description files at runtime." repository: https://github.com/flutter/packages/tree/main/packages/rfw issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+rfw%22 -version: 1.0.26 +version: 1.0.27 environment: sdk: ^3.2.0 diff --git a/packages/rfw/test/material_widgets_test.dart b/packages/rfw/test/material_widgets_test.dart index 56da9abfd92b..323286b539e6 100644 --- a/packages/rfw/test/material_widgets_test.dart +++ b/packages/rfw/test/material_widgets_test.dart @@ -586,4 +586,82 @@ void main() { expect(tester.widget(find.byType(Material)).clipBehavior, Clip.antiAlias); }); + + testWidgets('Slider properties', (WidgetTester tester) async { + final Runtime runtime = setupRuntime(); + final DynamicContent data = DynamicContent(); + final List eventLog = []; + await tester.pumpWidget( + MaterialApp( + theme: ThemeData(useMaterial3: false), + home: RemoteWidget( + runtime: runtime, + data: data, + widget: const FullyQualifiedWidgetName(testName, 'root'), + onEvent: (String eventName, DynamicMap eventArguments) { + eventLog.add('$eventName $eventArguments'); + }, + ), + ), + ); + expect( + tester.takeException().toString(), + contains('Could not find remote widget named'), + ); + + runtime.update(testName, parseLibraryFile(''' + import core; + import material; + widget root = Scaffold( + body: Center( + child: Slider( + onChanged: event 'slider' { }, + min: 10.0, + max: 100.0, + divisions: 100, + value: 20.0, + activeColor: 0xFF0000FF, + inactiveColor: 0xFF00FF00, + secondaryActiveColor: 0xFFFF0000, + thumbColor: 0xFF000000, + ))); + ''')); + await tester.pump(); + + final Finder sliderFinder = find.byType(Slider); + final Slider slider = tester.widget(sliderFinder); + expect(slider.value, 20.0); + expect(slider.min, 10.0); + expect(slider.max, 100.0); + expect(slider.divisions, 100); + expect(slider.activeColor, const Color(0xFF0000FF)); + expect(slider.inactiveColor, const Color(0xFF00FF00)); + expect(slider.secondaryActiveColor, const Color(0xFFFF0000)); + expect(slider.thumbColor, const Color(0xFF000000)); + + runtime.update(testName, parseLibraryFile(''' + import core; + import material; + + widget root = Scaffold( + body: Container( + child: Slider( + onChanged: event 'slider' { }, + onChangeStart: event 'slider.start' { }, + onChangeEnd: event 'slider.end' { }, + min: 0.0, + max: 100.0, + divisions: 100, + value: 0.0, + ))); + ''')); + await tester.pump(); + + //drag slider + await tester.slideToValue(sliderFinder, 20.0); + await tester.pumpAndSettle(); + expect(eventLog, contains('slider {value: 20.0}')); + expect(eventLog, contains('slider.start {value: 0.0}')); + expect(eventLog, contains('slider.end {value: 20.0}')); + }); } diff --git a/packages/rfw/test/utils.dart b/packages/rfw/test/utils.dart index a27455cf3e39..3aa7eb450135 100644 --- a/packages/rfw/test/utils.dart +++ b/packages/rfw/test/utils.dart @@ -5,6 +5,7 @@ import 'dart:io' show Platform; import 'package:flutter/foundation.dart'; +import 'package:flutter_test/flutter_test.dart'; // Detects if we're running the tests on the main channel. // @@ -21,3 +22,16 @@ bool get isMainChannel { // See Contributing section of README.md file. final bool runGoldens = !kIsWeb && Platform.isLinux && isMainChannel; + +// slide to value for material slider in tests +extension SlideTo on WidgetTester { + Future slideToValue(Finder slider, double value, + {double paddingOffset = 24.0}) async { + final Offset zeroPoint = getTopLeft(slider) + + Offset(paddingOffset, getSize(slider).height / 2); + final double totalWidth = getSize(slider).width - (2 * paddingOffset); + final double calculateOffset = value * (totalWidth / 100); + await dragFrom(zeroPoint, Offset(calculateOffset, 0)); + } +} + From 70c0c4d3041ed67d6bd59495f444d449ddc363c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nemanja=20Mladenovic=CC=81?= Date: Thu, 25 Apr 2024 14:40:01 +0200 Subject: [PATCH 2/7] Updated CHANGELOG.md --- packages/rfw/CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/rfw/CHANGELOG.md b/packages/rfw/CHANGELOG.md index 7f1da5e2f35b..8ee14a8443d6 100644 --- a/packages/rfw/CHANGELOG.md +++ b/packages/rfw/CHANGELOG.md @@ -1,3 +1,6 @@ +## 1.0.27 +* Adds `Slider` material widget + ## 1.0.26 * Supports overriding the error widget builder. From a0d3e4406effb760a1d62c3ffb6025f446a40e77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nemanja=20Mladenovic=CC=81?= Date: Thu, 25 Apr 2024 15:13:32 +0200 Subject: [PATCH 3/7] Fixed tests for web --- packages/rfw/test/material_widgets_test.dart | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/rfw/test/material_widgets_test.dart b/packages/rfw/test/material_widgets_test.dart index 323286b539e6..7acfd0f4e7dd 100644 --- a/packages/rfw/test/material_widgets_test.dart +++ b/packages/rfw/test/material_widgets_test.dart @@ -660,8 +660,15 @@ void main() { //drag slider await tester.slideToValue(sliderFinder, 20.0); await tester.pumpAndSettle(); - expect(eventLog, contains('slider {value: 20.0}')); - expect(eventLog, contains('slider.start {value: 0.0}')); - expect(eventLog, contains('slider.end {value: 20.0}')); + expect(eventLog, + contains(kIsWeb ? 'slider {value: 20}' : 'slider {value: 20.0}')); + expect( + eventLog, + contains( + kIsWeb ? 'slider.start {value: 0}' : 'slider.start {value: 0.0}')); + expect( + eventLog, + contains( + kIsWeb ? 'slider.end {value: 20}' : 'slider.end {value: 20.0}')); }); } From e36ff8fbac46a7a6451351950807e27cdc9d7446 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nemanja=20Mladenovic=CC=81?= Date: Thu, 25 Apr 2024 15:50:08 +0200 Subject: [PATCH 4/7] Fixed formatting and end of line in utils --- packages/rfw/test/utils.dart | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/rfw/test/utils.dart b/packages/rfw/test/utils.dart index 3aa7eb450135..9b355ed46b9a 100644 --- a/packages/rfw/test/utils.dart +++ b/packages/rfw/test/utils.dart @@ -27,11 +27,10 @@ final bool runGoldens = !kIsWeb && Platform.isLinux && isMainChannel; extension SlideTo on WidgetTester { Future slideToValue(Finder slider, double value, {double paddingOffset = 24.0}) async { - final Offset zeroPoint = getTopLeft(slider) + - Offset(paddingOffset, getSize(slider).height / 2); + final Offset zeroPoint = + getTopLeft(slider) + Offset(paddingOffset, getSize(slider).height / 2); final double totalWidth = getSize(slider).width - (2 * paddingOffset); final double calculateOffset = value * (totalWidth / 100); await dragFrom(zeroPoint, Offset(calculateOffset, 0)); } } - From d502d4676df74c52140a1e21f266ec5d5d358130 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nemanja=20Mladenovic=CC=81?= Date: Tue, 7 May 2024 09:39:45 +0200 Subject: [PATCH 5/7] - Fixed material slider handler indentations per guideline. - Changed slideToValue to be function instead of extension - Added space after : in material slider label default text --- packages/rfw/lib/src/flutter/material_widgets.dart | 8 ++++---- packages/rfw/test/material_widgets_test.dart | 14 +++++++++++++- packages/rfw/test/utils.dart | 12 ------------ 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/packages/rfw/lib/src/flutter/material_widgets.dart b/packages/rfw/lib/src/flutter/material_widgets.dart index fc1db065e01b..6188eceecfef 100644 --- a/packages/rfw/lib/src/flutter/material_widgets.dart +++ b/packages/rfw/lib/src/flutter/material_widgets.dart @@ -505,20 +505,20 @@ Map get _materialWidgetsDefinitions => (['min']) ?? 0.0; final value = source.v(['value']) ?? min; final labelText = source.v(['label']); - final label = labelText != null ? '$labelText:${value.toStringAsFixed(2)}' : value.toStringAsFixed(2); + final label = labelText != null ? '$labelText: ${value.toStringAsFixed(2)}' : value.toStringAsFixed(2); return Slider( value: value, secondaryTrackValue: source.v(['secondaryTrackValue']), onChanged: source.handler(['onChanged'], - (HandlerTrigger trigger) => (double value) { + (HandlerTrigger trigger) => (double value) { trigger({'value': value}); }), onChangeStart: source.handler(['onChangeStart'], - (HandlerTrigger trigger) => (double value) { + (HandlerTrigger trigger) => (double value) { trigger({'value': value}); }), onChangeEnd: source.handler(['onChangeEnd'], - (HandlerTrigger trigger) => (double value) { + (HandlerTrigger trigger) => (double value) { trigger({'value': value}); }), min: min, diff --git a/packages/rfw/test/material_widgets_test.dart b/packages/rfw/test/material_widgets_test.dart index 7acfd0f4e7dd..b66ecbd5776c 100644 --- a/packages/rfw/test/material_widgets_test.dart +++ b/packages/rfw/test/material_widgets_test.dart @@ -658,7 +658,7 @@ void main() { await tester.pump(); //drag slider - await tester.slideToValue(sliderFinder, 20.0); + await _slideToValue(tester, sliderFinder, 20.0); await tester.pumpAndSettle(); expect(eventLog, contains(kIsWeb ? 'slider {value: 20}' : 'slider {value: 20.0}')); @@ -672,3 +672,15 @@ void main() { kIsWeb ? 'slider.end {value: 20}' : 'slider.end {value: 20.0}')); }); } +// slide to value for material slider in tests +Future _slideToValue( + WidgetTester widgetTester, Finder slider, double value, + {double paddingOffset = 24.0}) async { + final Offset zeroPoint = widgetTester.getTopLeft(slider) + + Offset(paddingOffset, widgetTester.getSize(slider).height / 2); + final double totalWidth = + widgetTester.getSize(slider).width - (2 * paddingOffset); + final double calculateOffset = value * (totalWidth / 100); + await widgetTester.dragFrom(zeroPoint, Offset(calculateOffset, 0)); +} + diff --git a/packages/rfw/test/utils.dart b/packages/rfw/test/utils.dart index 9b355ed46b9a..6198f3925c02 100644 --- a/packages/rfw/test/utils.dart +++ b/packages/rfw/test/utils.dart @@ -22,15 +22,3 @@ bool get isMainChannel { // See Contributing section of README.md file. final bool runGoldens = !kIsWeb && Platform.isLinux && isMainChannel; - -// slide to value for material slider in tests -extension SlideTo on WidgetTester { - Future slideToValue(Finder slider, double value, - {double paddingOffset = 24.0}) async { - final Offset zeroPoint = - getTopLeft(slider) + Offset(paddingOffset, getSize(slider).height / 2); - final double totalWidth = getSize(slider).width - (2 * paddingOffset); - final double calculateOffset = value * (totalWidth / 100); - await dragFrom(zeroPoint, Offset(calculateOffset, 0)); - } -} From 771f595e0e0ab75c253d2d177db55a0d4da32052 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nemanja=20Mladenovic=CC=81?= Date: Tue, 7 May 2024 09:58:08 +0200 Subject: [PATCH 6/7] - Fixed unused import --- packages/rfw/test/material_widgets_test.dart | 2 +- packages/rfw/test/utils.dart | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/rfw/test/material_widgets_test.dart b/packages/rfw/test/material_widgets_test.dart index b66ecbd5776c..08ac4351ebf5 100644 --- a/packages/rfw/test/material_widgets_test.dart +++ b/packages/rfw/test/material_widgets_test.dart @@ -672,6 +672,7 @@ void main() { kIsWeb ? 'slider.end {value: 20}' : 'slider.end {value: 20.0}')); }); } + // slide to value for material slider in tests Future _slideToValue( WidgetTester widgetTester, Finder slider, double value, @@ -683,4 +684,3 @@ Future _slideToValue( final double calculateOffset = value * (totalWidth / 100); await widgetTester.dragFrom(zeroPoint, Offset(calculateOffset, 0)); } - diff --git a/packages/rfw/test/utils.dart b/packages/rfw/test/utils.dart index 6198f3925c02..c320de69eea2 100644 --- a/packages/rfw/test/utils.dart +++ b/packages/rfw/test/utils.dart @@ -5,8 +5,6 @@ import 'dart:io' show Platform; import 'package:flutter/foundation.dart'; -import 'package:flutter_test/flutter_test.dart'; - // Detects if we're running the tests on the main channel. // // This is useful for _tests_ that depend on _Flutter_ features that have not From 6f89100d997da9c8b54e9b299d2ad15995b23028 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nemanja=20Mladenovic=CC=81?= Date: Tue, 7 May 2024 10:17:12 +0200 Subject: [PATCH 7/7] - Fixed formatting for utils --- packages/rfw/test/utils.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/rfw/test/utils.dart b/packages/rfw/test/utils.dart index c320de69eea2..a27455cf3e39 100644 --- a/packages/rfw/test/utils.dart +++ b/packages/rfw/test/utils.dart @@ -5,6 +5,7 @@ import 'dart:io' show Platform; import 'package:flutter/foundation.dart'; + // Detects if we're running the tests on the main channel. // // This is useful for _tests_ that depend on _Flutter_ features that have not