(1)も(2)も実現可能です。
(1)に関しては「ページ遷移で完了」ではなく、「ファイル作成で完了」という考え方にシフトしたほうがやりやすいと思います。ボタン押下時、ファイルダウンロード完了時にsetState
でスピナー表示/非表示を切り替えるなど。
イメージ↓
動画選択時の処理
Dart
1bool _loading = false;
2
3void _downloadVideo() async {
4 // スピナー表示
5 setState(() => _loading = true);
6 _file = await xxxxxxxxxxxx().then((data) {
7 // ダウンロード終了後
8 // スピナー非表示
9 setState(() => _loading = false);
10 // 画面遷移
11 Navigator.xxxxxxxxxxxxxxxxxxxxxxxxxx;
12 });
13}
14
15...
16 child: _loading
17 ? CircularProgressIndicator() // _loadingがtrueならスピナー表示
18 : VideoListView(), // falseなら一覧表示
19...
20
スピナーをオーバーレイ表示にしたい場合はこっちが向いている?
(2)は、FutureBuilder
でssnapshot.hasData
がfalse
の時はスピナー表示、true
になったらスピナーを消すという風にやればいいと思います。
イメージ↓
Dart
1
2...
3 child: FutureBuilder(
4 future: _downloadVideo,
5 builder: (BuildContext context, AsyncSnapshot snapshot) {
6 if (snapshot.hasData) {
7 // ダウンロード完了したら動画再生画面を表示
8 return VideoPlayerView();
9 } else if (snapshot.hasError) {
10 // エラー表示
11 return Error();
12 } else {
13 // ダウンロード完了するまではスピナー表示
14 return CircularProgressIndicator();
15 }
16 },
17 ),
18...
19
20Future<File> _downloadVideo() async {
21 // ファイルダウンロード
22 _file = await xxxxxxxxxxxxxxxxxx();
23 // ファイル準備
24 return await xxxxxxxxxxxxxx(_file );
25}