一般的にFuture(もしくはasync関数)での結果をウィジェットの内容として使うのであれば、FutureBuilderを使う(推奨方法)か表示用のデータが集まった後にsetStateを呼び出すかのどちらかです。
以下はFutureBuilderのAPIヘルプのリンクです。
https://api.flutter.dev/flutter/widgets/FutureBuilder-class.html
このサンプルを見れば分かるんじゃないでしょうか。
上のコードでは実装されている関数だけで動作順序を見ると、以下の様になるんじゃないでしょうか。
多分Future内の関数はbuildでウィジェット作成の後に呼び出される感じです。
- 番号リストcreateStateで_MyHomePageStateのインスタンスを作成
- initStateが呼び出されFutureの実行が予約される
- buildでウィジェットの作成をする
- Futureに登録されている関数が実行される
initState内かbuildでウィジェット作成前に、initStateで呼び出したFutureをawaitすればFuture内の関数の処理完了後ウィジェットの作成を行うこともできますが、これはFutureの処理時間が一瞬である前提であれば良いですが、処理時間が長期に及ぶ場合、そこで処理がいったん止まるので、いい対策とは言えないです。
initState内でawaitする件については、initStateがもともとasyncな関数ではなく、上位側からawaitされていないので、対応として問題があるので記述として削除しました。
initState内のFuture関数内でsetStateする処理のサンプルです。
dart
1class ListTile2 extends StatefulWidget {
2 const ListTile2({Key? key}) : super(key: key);
3
4 @override
5 State<ListTile2> createState() => _ListTile2State();
6}
7
8class _ListTile2State extends State<ListTile2> {
9 @override
10 void initState() {
11 super.initState();
12 Future(() async {
13 await Future.delayed(const Duration(seconds: 1));
14 value = "hoge";
15 setState(() {});
16 });
17 }
18
19 String value = "10"; // これが表示用のデータで初期値10でFuture内でhogeに変更している。
20
21 @override
22 Widget build(BuildContext context) {
23 return Scaffold(
24 appBar: AppBar(
25 title: const Text("ListTile2 test"),
26 ),
27 body: Card(
28 child: ListTile(
29 title: Row(
30 mainAxisAlignment: MainAxisAlignment.spaceBetween,
31 children: [Text(value), const Text("10")],
32 ),
33 trailing: const Icon(Icons.arrow_forward_ios),
34 ),
35 ),
36 );
37 }
38}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/09/19 05:14
2022/09/19 08:29
2022/09/19 10:36
2022/09/19 11:23
2022/09/19 15:24