概要
Flutterが用意しているデフォルトのスプラッシュスクリーンの表示中に、アプリの初期化処理、通信を含む時間のかかる処理などを含め実行する方法のメモ。
TL;TR
エントリーポイントのmain()
でrunApp
を呼び出す前に処理を挿入することで、スプラッシュスクリーン表示中に処理を実行できる。
例
void main() {
// やりたい初期化処理などをここに記述
runApp(MyApp());
}
さらに、ここに非同期処理を入れたい場合はmain()
をasync
にして、await
で非同期処理を同期的に処理することでできる。
void main() async {
await asyncMethod(); // 非同期処理はawaitで同期的に実行
runApp(MyApp());
}
スプラッシュスクリーンについて
Flutterのスプラッシュスクリーンに関しては検索すると色々な実装方法が紹介れているが、実は現バージョンではプロジェクト作成時にデフォルトのスプラッシュスクリーンが実装されている。ただ、表示時間が短いので気づかないかもしれない。
本記事でスプラッシュスクリーンと言っているのはこのデフォルトのスプラッシュスクリーンのこと。スプラッシュスクリーン自体のカスタマイズはググればいくらでも出てくるので、ここでは触れない。
非同期処理を入れる例
スプラッシュスクリーンの表示中に処理を実行するには、通常の処理ならば上で書いたとおりなので、自動ログインやファイルの読み書きなど時間のかかる(通常非同期の)処理を実行する例を下に示す。
import 'package:flutter/material.dart';
String foo;
void main() async { // asyncにする
// 初期化処理。この例ではdealyedを使って時間のかかる処理をシミュレートしている
await Future.delayed(Duration(seconds: 5), () => foo = 'bar');
// runAppが呼び出されることでスプラッシュスクリーンから遷移するようだ
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Center(child: Text(foo)),
);
}
}
初期化処理で非同期処理を入れたい場合はmain()
をasync
にして、await
で非同期処理をmain()
内で同期的に処理することで、時間のかかる処理もスプラッシュスクリーン表示中にできる。
下のMyApp
の中で、初期化処理で値を代入している変数foo
を画面に表示している。
初期化処理で代入している値 "bar" が表示されるので、ちゃんと初期化処理が完了していることがわかる。