import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
// This widget is the root of your application.
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: FibonacciWidget(),
);
}
}
class FibonacciWidget extends StatelessWidget {
Widget build(BuildContext context) {
return FutureBuilder(
future: 関数A, //今回はここを変えます
builder: (_, snapshot) {
if (!snapshot.hasData) {
return Scaffold(
appBar: AppBar(
title: const Text("fibonacci"),
),
body: const Center(
child: CircularProgressIndicator(),
),
);
} else {
return Scaffold(
appBar: AppBar(
title: const Text("fibonacci"),
),
body: Center(
child: Text("${snapshot.data}"),
),
);
}
});
}
}
// 非同期でn秒待つだけの関数
Future<String> delayTime(int n) async {
await Future.delayed(Duration(seconds: num));
return "${n}秒経過しました";
}
// 非同期でn番目のフィボナッチ数列を求める関数
Future<int> asyncFibonacci(int n) async {
return n < 2 ? n : (await asyncFibonacci(n - 1) + await asyncFibonacci(n - 2));
}
// 並列処理でn番目のフィボナッチ数列を求める関数
int paraFibonacci(int n) {
return n < 2 ? n : (paraFibonacci(n - 1) + paraFibonacci(n - 2));
}
delayTime(3)
をセットします。3秒だけ待ち結果を返す軽い処理です。
問題なく円形プログレスインジケーターが表示されてますね。asyncFibonacci(35)
をセットします。フィボナッチ数列の説明は省略しますが、計算に時間がかかる処理です。円形プログレスインジケーターは表示されず、結果が表示されています。これはasyncFibonacci(35)
がスレッドを占有し、円形プログレスインジケーターが表示を妨げていることが原因です。compute(関数, 引数)
とすることで並列処理が簡単に利用できます。関数Aにcompute(paraFibonacci, 42)
をセットします。compute(paraFibonacci, 42)
を実施することで、円形プログレスインジケーターの描画に影響を与えずに処理ができているためです。