| // 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/material.dart'; |
| |
| import 'recorder.dart'; |
| import 'test_data.dart'; |
| |
| /// Creates an infinite list of Material cards and scrolls it. |
| class BenchCardInfiniteScroll extends WidgetRecorder { |
| BenchCardInfiniteScroll.forward() |
| : initialOffset = 0.0, |
| finalOffset = 30000.0, |
| super(name: benchmarkName); |
| |
| BenchCardInfiniteScroll.backward() |
| : initialOffset = 30000.0, |
| finalOffset = 0.0, |
| super(name: benchmarkNameBackward); |
| |
| static const String benchmarkName = 'bench_card_infinite_scroll'; |
| static const String benchmarkNameBackward = 'bench_card_infinite_scroll_backward'; |
| |
| final double initialOffset; |
| final double finalOffset; |
| |
| @override |
| Widget createWidget() => MaterialApp( |
| title: 'Infinite Card Scroll Benchmark', |
| home: _InfiniteScrollCards(initialOffset, finalOffset), |
| ); |
| } |
| |
| class _InfiniteScrollCards extends StatefulWidget { |
| const _InfiniteScrollCards(this.initialOffset, this.finalOffset); |
| |
| final double initialOffset; |
| final double finalOffset; |
| |
| @override |
| State<_InfiniteScrollCards> createState() => _InfiniteScrollCardsState(); |
| } |
| |
| class _InfiniteScrollCardsState extends State<_InfiniteScrollCards> { |
| 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 SizedBox( |
| height: 100.0, |
| child: Card( |
| elevation: 16.0, |
| child: Text( |
| '${lipsum[index % lipsum.length]} $index', |
| textAlign: TextAlign.center, |
| ), |
| ), |
| ); |
| }, |
| ); |
| } |
| } |