質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Q&A

解決済

1回答

3826閲覧

Flutter ページ遷移するまでの時間スピナーを表示させたい

moriman

総合スコア615

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

0グッド

0クリップ

投稿2020/07/10 01:57

ページ遷移するまで時間がかかる場合にスピナー(CircularProgressIndicator())
を表示させたいです。

https://flutter.dev/docs/cookbook/plugins/play-video

スピナー表示に関しては上記ページで動画再生準備完了までの間スピナーを表示するサンプルがあるのですが、FutureBuilderを使っており、futureに関してはVideoPlayerControllerクラスを使えば、その中で自動的に用意してくれるので、それをFutureBuilderの引数に設定すれば、それだけでできる、ということらしいです。

ということで、そういうのを用意してくれていれば、それを使えばいいと思うのですが。
つまり、今回の場合、ページ遷移した時にコンプリートするfutureを用いてFutureBuilderを作る必要があるのだと思うのですが。
このfutureは自分で実装するしかないのでしょうか?

「ページ遷移するまでスピナー表示させたい」という要求自体かなり一般的な気がするので、すでにそういうfutureを作る仕組みが用意されているのならそれを使いたいのですが、あるんでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tepci

2020/07/10 03:03

ページ遷移するまで時間がかかるのは具体的にどんな処理が原因でしょうか? 例えばサーバーとの通信や、ファイル読み書きなどがあります。ただ単に〇秒待ったあとにのFutureを返すメソッドも作ることもできます。
moriman

2020/07/10 03:20

回答を頂きましてありがとうございます。 今回は、「一覧リスト表示画面」と「動画再生画面」がありまして、 「一覧リスト表示画面」内のボタンを押す(ファイルを選択) ↓ 「一覧リスト表示画面」で選択されたファイルを作成(10秒程度) ↓ 作成完了後「動画再生画面」へ遷移。その際作成したファイルを 引数として渡す。 ↓ 「動画再生画面」で再生準備完了までの間スピナー表示(1秒程度) ↓ 動画再生 という流れで、ファイル作成で時間がかかっているのにその間はスピナーも何もなく「一覧リスト表示画面」が表示されているだけなので、ユーザーも「え?動いてるの?」という感じです笑 対応としては (1)「一覧リスト表示画面」で、ページ遷移で完了するfutureを作ってスピナーを表示させる。 (2)「動画再生画面」でファイルを作成し、「ファイル作成→動画再生準備」が完了した時にコンプリートするfutureを作る→スピナーを表示。 上記の選択肢が頭に浮かぶのですが、(2)に関して、firebase_storageにあるファイルをクライアント側で作成(複製)するのは非同期処理になると思うのですが、 「動画再生画面」ウィジェットのbuild()メソッド内でawaitが使えない気がします。なので(2)の選択肢は不可能なんですかね? であれば(1)になるのですが、ページ遷移完了でコンプリートするfutureの作り方がわかりません。
tepci

2020/07/10 04:41

少し整理させてください。 対応策(1) 1.「一覧リスト表示画面」で動画一覧を表示。 2.動画を選択するとstorageから動画をダウンロード(ダウンロードされるまでスピナー表示) 3.ダウンロード完了後、「動画再生画面」へ遷移 4.再生準備完了されるまでスピナー表示 対応策(2) 1.「一覧リスト表示画面」で動画一覧を表示。 2.動画を選択すると「動画再生画面」へ遷移 3.遷移後、storageから動画をダウンロード(ダウンロード→再生準備完了までスピナー表示) 以上のような順序の認識で間違いないですか?
moriman

2020/07/10 05:21

はい、そのように考えています。 ただやはり(2)の場合、「動画再生画面」ウィジェットのbuild()メソッド内でファイルを複製(ダウンロード)する処理はできないんですよね。(awaitが使えない。) ただ、VideoPlayerの準備も非同期処理のはずで、それはできているので、結局ファイル複製(ダウンロード)もどうにかしたらできるはず、だとは思うのですけどね。
guest

回答1

0

ベストアンサー

(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)は、FutureBuilderssnapshot.hasDatafalseの時はスピナー表示、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}

投稿2020/07/10 05:54

編集2020/07/10 06:18
tepci

総合スコア419

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

moriman

2020/07/16 23:16

(1)の方法でスピナー出せました。 非常に便利なパッケージですね。 (2)も期を見てやってみようと思います。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問