diff --git a/dev/benchmarks/macrobenchmarks/lib/common.dart b/dev/benchmarks/macrobenchmarks/lib/common.dart index 372e5b2ab8..92b47296f3 100644 --- a/dev/benchmarks/macrobenchmarks/lib/common.dart +++ b/dev/benchmarks/macrobenchmarks/lib/common.dart @@ -34,6 +34,7 @@ const String kAnimatedComplexOpacityPerfRouteName = '/animated_complex_opacity'; const String kAnimatedComplexImageFilteredPerfRouteName = '/animated_complex_image_filtered'; const String kListTextLayoutRouteName = '/list_text_layout'; const String kAnimatedBlurBackdropFilter = '/animated_blur_backdrop_filter'; +const String kSlidersRouteName = '/sliders'; const String kOpacityPeepholeOneRectRouteName = '$kOpacityPeepholeRouteName/one_big_rect'; const String kOpacityPeepholeColumnOfOpacityRouteName = '$kOpacityPeepholeRouteName/column_of_opacity'; diff --git a/dev/benchmarks/macrobenchmarks/lib/main.dart b/dev/benchmarks/macrobenchmarks/lib/main.dart index 720125fee3..2479e39280 100644 --- a/dev/benchmarks/macrobenchmarks/lib/main.dart +++ b/dev/benchmarks/macrobenchmarks/lib/main.dart @@ -34,6 +34,7 @@ import 'src/raster_cache_use_memory.dart'; import 'src/shader_mask_cache.dart'; import 'src/simple_animation.dart'; import 'src/simple_scroll.dart'; +import 'src/sliders.dart'; import 'src/stack_size.dart'; import 'src/text.dart'; @@ -85,6 +86,7 @@ class MacrobenchmarksApp extends StatelessWidget { kListTextLayoutRouteName: (BuildContext context) => const ColumnOfText(), kAnimatedComplexImageFilteredPerfRouteName: (BuildContext context) => const AnimatedComplexImageFiltered(), kAnimatedBlurBackdropFilter: (BuildContext context) => const AnimatedBlurBackdropFilter(), + kSlidersRouteName: (BuildContext context) => const SlidersPage(), }, ); } @@ -319,6 +321,13 @@ class HomePage extends StatelessWidget { Navigator.pushNamed(context, kAnimatedBlurBackdropFilter); }, ), + ElevatedButton( + key: const Key(kSlidersRouteName), + child: const Text('Sliders'), + onPressed: () { + Navigator.pushNamed(context, kSlidersRouteName); + }, + ), ], ), ); diff --git a/dev/benchmarks/macrobenchmarks/lib/src/sliders.dart b/dev/benchmarks/macrobenchmarks/lib/src/sliders.dart new file mode 100644 index 0000000000..8ea0a4571f --- /dev/null +++ b/dev/benchmarks/macrobenchmarks/lib/src/sliders.dart @@ -0,0 +1,65 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:ui'; + +import 'package:flutter/material.dart'; + +class SlidersPage extends StatefulWidget { + const SlidersPage({super.key}); + + @override + State createState() => _SlidersPageState(); +} + +class _SlidersPageState extends State with TickerProviderStateMixin { + late AnimationController _sliderController; + late Animation _sliderAnimation; + double _sliderValue = 0.0; + RangeValues _rangeSliderValues = const RangeValues(0.0, 1.0); + + @override + void initState() { + super.initState(); + _sliderController = AnimationController( + duration: const Duration(seconds: 1), + vsync: this, + )..repeat(); + _sliderAnimation = Tween(begin: 0, end: 1).animate(_sliderController) + ..addListener(() { + setState(() { + _sliderValue = _sliderAnimation.value; + _rangeSliderValues = RangeValues( + clampDouble(_sliderAnimation.value, 0, 0.45), + 1.0 - clampDouble(_sliderAnimation.value, 0, 0.45), + ); + }); + }); + } + + @override + void dispose() { + _sliderController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Material( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Slider( + value: _sliderValue, + onChanged: (double value) { }, + ), + RangeSlider( + values: _rangeSliderValues, + onChanged: (RangeValues values) { }, + ), + ], + ), + ); + } +} diff --git a/dev/benchmarks/macrobenchmarks/test_driver/sliders_perf_test.dart b/dev/benchmarks/macrobenchmarks/test_driver/sliders_perf_test.dart new file mode 100644 index 0000000000..b46a6322be --- /dev/null +++ b/dev/benchmarks/macrobenchmarks/test_driver/sliders_perf_test.dart @@ -0,0 +1,16 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:macrobenchmarks/common.dart'; + +import 'util.dart'; + +void main() { + macroPerfTest( + 'sliders_perf', + kSlidersRouteName, + pageDelay: const Duration(seconds: 1), + duration: const Duration(seconds: 10), + ); +} diff --git a/dev/devicelab/bin/tasks/slider_perf_android.dart b/dev/devicelab/bin/tasks/slider_perf_android.dart new file mode 100644 index 0000000000..a7c24817fe --- /dev/null +++ b/dev/devicelab/bin/tasks/slider_perf_android.dart @@ -0,0 +1,14 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:async'; + +import 'package:flutter_devicelab/framework/devices.dart'; +import 'package:flutter_devicelab/framework/framework.dart'; +import 'package:flutter_devicelab/tasks/perf_tests.dart'; + +Future main() async { + deviceOperatingSystem = DeviceOperatingSystem.android; + await task(createSlidersPerfTest()); +} diff --git a/dev/devicelab/lib/tasks/perf_tests.dart b/dev/devicelab/lib/tasks/perf_tests.dart index b3bdfb15d5..a49511407a 100644 --- a/dev/devicelab/lib/tasks/perf_tests.dart +++ b/dev/devicelab/lib/tasks/perf_tests.dart @@ -308,6 +308,15 @@ TaskFunction createTextfieldPerfE2ETest() { ).run; } +TaskFunction createSlidersPerfTest() { + return PerfTest( + '${flutterDirectory.path}/dev/benchmarks/macrobenchmarks', + 'test_driver/run_app.dart', + 'sliders_perf', + testDriver: 'test_driver/sliders_perf_test.dart', + ).run; +} + TaskFunction createStackSizeTest() { final String testDirectory = '${flutterDirectory.path}/dev/benchmarks/macrobenchmarks';