| // 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'; | |
| 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 (var i = 0; i < 100; ++i) { | |
| unawaited(_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 sw = Stopwatch()..start(); | |
| while (!_canceled && sw.elapsed < duration) {} | |
| } | |
| } |