私はflutter/Dartが初めてなので、アプリを作ろうとしている間、なぜ物事が特定の方法であるのかを理解しようとします。 flutterドキュメントには、次のようにステートフルウィジェットのサンプルコードがあります。
_class YellowBird extends StatefulWidget {
const YellowBird({ Key key }) : super(key: key);
@override
_YellowBirdState createState() => new _YellowBirdState();
}
class _YellowBirdState extends State<YellowBird> {
@override
Widget build(BuildContext context) {
return new Container(color: const Color(0xFFFFE306));
}
}
_
質問:
なぜ1つではなく2つのクラスで定義されているのですか? Stateクラスはどこか他の場所で使用できると思うので、分割する方が良いでしょう。
私が理解していることから、createState()
関数はState
型のオブジェクトを返すため、__YellowBirdState extends State
_を持つことは理にかなっていますが、YellowBird
がState
?私の推測では、Yellowbird
クラスを拡張するStatefulWidget
と関係があるようですが、よくわかりません。
複数の理由があります。
ウィジェットは不変です。 StatefulWidget
はWidget
を拡張するので、不変でなければなりません。宣言を2つのクラスに分割すると、StatefulWidget
を不変にしたり、State
を変更したりすることができます。
ウィジェットは、構文new MyWidget()
を使用してインスタンス化されます。両方のクラスを1つにマージした場合、new MyWidget()
は、親が更新されるたびに状態のすべてのプロパティをリセットします。
class _MyStatefulState extends State<MyStateful>
の説明は
これは、State
クラスがthis.widget
フィールドを使用してStateful
パーツにアクセスできるためです。ジェネリックは、単にMyStateful
ではなくStatefulWidget
型のフィールドを作成するためのものです。 MyStateful
プロパティにアクセスしたい場合があります。
Flutterの主な設計上の決定の1つは、ウィジェットを再作成する方が安価であるため、何かが変更されたときにbuild()
を呼び出してウィジェットツリーのブランチを再構築することができます。これは、コンストラクターを介して不変の値が指定されているステートレスウィジェットでは正常に機能します。ただし、ステートフルウィジェットは、ビルド間で状態を保持する必要があります。あなたの例では、フレームワークは複数のYellowBird
sを作成できますが、作成するのは1つのYellowBirdState
だけです。新しく作成された各YellowBird
は、フレームワークによって既存のYellowBirdState
に透過的に接続されます。
State
のサブクラスは、コンパイラが変数widget
のタイプを認識できるように、ウィジェットタイプを認識する必要があります。 YellowBirdState
では、widget
でウィジェットを参照できます。 YellowBird
にメンバー変数がある場合final String foo
、コンパイラはwidget.foo
は、YellowBird
のfooという文字列です。