| // 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 'dart:ui_web' as ui_web; |
| |
| import 'package:flutter/material.dart'; |
| import 'package:web/web.dart' as web; |
| |
| import 'recorder.dart'; |
| |
| const String benchmarkViewType = 'benchmark_element'; |
| |
| void _registerFactory() { |
| ui_web.platformViewRegistry.registerViewFactory(benchmarkViewType, (int viewId) { |
| final web.HTMLElement htmlElement = |
| web.document.createElement('div') as web.HTMLDivElement; |
| htmlElement.id = '${benchmarkViewType}_$viewId'; |
| htmlElement.innerText = 'Google'; |
| htmlElement.style |
| ..setProperty('width', '100%') |
| ..setProperty('height', '100%') |
| ..setProperty('color', 'black') |
| ..setProperty('backgroundColor', 'rgba(0, 255, 0, .5)') |
| ..setProperty('textAlign', 'center') |
| ..setProperty('border', '1px solid black'); |
| return htmlElement; |
| }); |
| } |
| |
| /// Creates an infinite list of Link widgets and scrolls it. |
| class BenchPlatformViewInfiniteScroll extends WidgetRecorder { |
| BenchPlatformViewInfiniteScroll.forward() |
| : initialOffset = 0.0, |
| finalOffset = 30000.0, |
| super(name: benchmarkName) { |
| _registerFactory(); |
| } |
| |
| BenchPlatformViewInfiniteScroll.backward() |
| : initialOffset = 30000.0, |
| finalOffset = 0.0, |
| super(name: benchmarkNameBackward) { |
| _registerFactory(); |
| } |
| |
| static const String benchmarkName = 'bench_platform_view_infinite_scroll'; |
| static const String benchmarkNameBackward = |
| 'bench_platform_view_infinite_scroll_backward'; |
| |
| final double initialOffset; |
| final double finalOffset; |
| |
| @override |
| Widget createWidget() => MaterialApp( |
| title: 'Infinite Platform View Scroll Benchmark', |
| home: _InfiniteScrollPlatformViews(initialOffset, finalOffset), |
| ); |
| } |
| |
| class _InfiniteScrollPlatformViews extends StatefulWidget { |
| const _InfiniteScrollPlatformViews(this.initialOffset, this.finalOffset); |
| |
| final double initialOffset; |
| final double finalOffset; |
| |
| @override |
| State<_InfiniteScrollPlatformViews> createState() => _InfiniteScrollPlatformViewsState(); |
| } |
| |
| class _InfiniteScrollPlatformViewsState extends State<_InfiniteScrollPlatformViews> { |
| static const Duration stepDuration = Duration(seconds: 20); |
| |
| late ScrollController scrollController; |
| late double offset; |
| |
| @override |
| void initState() { |
| super.initState(); |
| |
| offset = widget.initialOffset; |
| |
| scrollController = ScrollController( |
| initialScrollOffset: offset, |
| ); |
| |
| // Without the timer the animation doesn't begin. |
| Timer.run(() async { |
| await scrollController.animateTo( |
| widget.finalOffset, |
| curve: Curves.linear, |
| duration: stepDuration, |
| ); |
| }); |
| } |
| |
| @override |
| void dispose() { |
| scrollController.dispose(); |
| super.dispose(); |
| } |
| |
| @override |
| Widget build(BuildContext context) { |
| return ListView.builder( |
| controller: scrollController, |
| itemExtent: 100.0, |
| itemBuilder: (BuildContext context, int index) { |
| return const SizedBox( |
| height: 100.0, |
| child: HtmlElementView(viewType: benchmarkViewType), |
| ); |
| }, |
| ); |
| } |
| } |