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

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

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

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

Q&A

解決済

1回答

1670閲覧

Flutter stateクラスのサブクラス内でinitState()を使う場合と使わない場合の違いについて

moriman

総合スコア615

Flutter

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

0グッド

0クリップ

投稿2020/03/02 01:44

編集2020/03/02 02:32

https://flutter.dev/docs/development/ui/interactive
上記ページでstateful widgetを使った状態管理について見ているのですが、
上記ページに出てくるサンプルではstateクラスのサブクラスのプロパティの初期化にinitState()メソッドが使われておらず、

class _FavoriteWidgetState extends State<FavoriteWidget> { bool _isFavorited = true; int _favoriteCount = 41; // ··· }

例えばFavoriteWidgetStateの場合上記のようにプロパティを宣言時に初期化しています。その下のサンプルの_TapboxAState、TapboxBの_ParentWidgetStateも同様です。

一方、
https://flutter.dev/docs/cookbook/plugins/play-video
上記ページの動画を再生するサンプルでもStatefulWidgetウィジェット、Stateウィジェット(のサブクラス)が使われているのですが、こちらでは_VideoPlayerScreenStateクラスのプロパティ_controllerと_initializeVideoPlayerFutureの初期化にinitState()メソッドが使われています。

この違いは何か意味があるのでしょうか?
状況によってinitState()を使ったり使わなかったり、という風に使い分けが必要なのでしょうか?
それともどちらでも一緒なのでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

プロパティの初期化では、他のプロパティを参照することができませんので、そういうケースではinitState()を使う必要があると思います。

以下のコードでは、_initializeVideoPlayerFutureの初期化に_controllerを使っているので、initState()で初期化する必要があります。_controllerはどちらでも構わないと思いますが、関連する初期化なので、両方initState()にしているのかもしれません。

class _VideoPlayerScreenState extends State<VideoPlayerScreen> { VideoPlayerController _controller; Future<void> _initializeVideoPlayerFuture; @override void initState() { // Create an store the VideoPlayerController. The VideoPlayerController // offers several different constructors to play videos from assets, files, // or the internet. _controller = VideoPlayerController.network( 'https://flutter.github.io/assets-for-api-docs/assets/videos/butterfly.mp4', ); _initializeVideoPlayerFuture = _controller.initialize(); super.initState(); } // 以下省略

なお、プロパティの初期化だけですむなら、initState()を使わない方がコードはすっきりすると思います(個人の見解)

投稿2020/03/02 03:27

編集2020/03/02 03:29
popobot

総合スコア6586

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

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

moriman

2020/03/02 03:40

回答をいただきましてありがとうございます。 「他のプロパティを参照することができない」というのは、その時点ではまだインスタンス生成が完了していないから、ということですかね。Swiftでそういう話があったような気がします。Flutter(Dart)でも一緒なのかはわからないのですが。 そういう場合に、他のプロパティを使った初期化が可能なのがinitState()メソッド、ということですか。
popobot

2020/03/02 04:15

そうだと思います。 たぶん、多くの言語で同じ仕様だと思います。
moriman

2020/03/03 00:56

わかりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問