| // 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:flutter/material.dart'; |
| |
| class AnimationWithMicrotasks extends StatefulWidget { |
| const AnimationWithMicrotasks({super.key}); |
| |
| @override |
| State<AnimationWithMicrotasks> createState() => _AnimationWithMicrotasksState(); |
| } |
| |
| class _AnimationWithMicrotasksState extends State<AnimationWithMicrotasks> { |
| final _ChunkedWork work = _ChunkedWork(); |
| |
| @override |
| void initState() { |
| super.initState(); |
| work.start(); |
| } |
| |
| @override |
| void dispose() { |
| work.cancel(); |
| super.dispose(); |
| } |
| |
| @override |
| Widget build(BuildContext context) { |
| return const Scaffold( |
| backgroundColor: Colors.grey, |
| body: Center( |
| child: SizedBox( |
| width: 200, |
| height: 100, |
| child: LinearProgressIndicator(), |
| ), |
| ), |
| ); |
| } |
| } |
| |
| class _ChunkedWork { |
| bool _canceled = false; |
| |
| Future<void> start() async { |
| // Run 100 pieces of synchronous work. |
| // Chunked up to allow frames to be drawn. |
| for (int i = 0; i < 100; ++i) { |
| _chunkedSynchronousWork(); |
| } |
| } |
| |
| void cancel() { |
| _canceled = true; |
| } |
| |
| Future<void> _chunkedSynchronousWork() async { |
| while (!_canceled) { |
| // Yield to the event loop to let engine draw frames. |
| await Future<void>.delayed(Duration.zero); |
| |
| // Perform synchronous computation for 1 ms. |
| _syncComputationFor(const Duration(milliseconds: 1)); |
| } |
| } |
| |
| void _syncComputationFor(Duration duration) { |
| final Stopwatch sw = Stopwatch()..start(); |
| while (!_canceled && sw.elapsed < duration) {} |
| } |
| } |