web-dev-qa-db-ja.com

ステートフルウィジェットがflutterで2つのクラスとして定義されているのはなぜですか?

私は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. なぜ1つではなく2つのクラスで定義されているのですか? Stateクラスはどこか他の場所で使用できると思うので、分割する方が良いでしょう。

  2. 私が理解していることから、createState()関数はState型のオブジェクトを返すため、__YellowBirdState extends State_を持つことは理にかなっていますが、YellowBirdState?私の推測では、Yellowbirdクラスを拡張するStatefulWidgetと関係があるようですが、よくわかりません。

22
DanT29

複数の理由があります。

  • ウィジェットは不変です。 StatefulWidgetWidgetを拡張するので、不変でなければなりません。宣言を2つのクラスに分割すると、StatefulWidgetを不変にしたり、Stateを変更したりすることができます。

  • ウィジェットは、構文new MyWidget()を使用してインスタンス化されます。両方のクラスを1つにマージした場合、new MyWidget()は、親が更新されるたびに状態のすべてのプロパティをリセットします。

class _MyStatefulState extends State<MyStateful>の説明は

これは、Stateクラスがthis.widgetフィールドを使用してStatefulパーツにアクセスできるためです。ジェネリックは、単にMyStatefulではなくStatefulWidget型のフィールドを作成するためのものです。 MyStatefulプロパティにアクセスしたい場合があります。

25
Rémi Rousselet
  1. Flutterの主な設計上の決定の1つは、ウィジェットを再作成する方が安価であるため、何かが変更されたときにbuild()を呼び出してウィジェットツリーのブランチを再構築することができます。これは、コンストラクターを介して不変の値が指定されているステートレスウィジェットでは正常に機能します。ただし、ステートフルウィジェットは、ビルド間で状態を保持する必要があります。あなたの例では、フレームワークは複数のYellowBirdsを作成できますが、作成するのは1つのYellowBirdStateだけです。新しく作成された各YellowBirdは、フレームワークによって既存のYellowBirdStateに透過的に接続されます。

  2. Stateのサブクラスは、コンパイラが変数widgetのタイプを認識できるように、ウィジェットタイプを認識する必要があります。 YellowBirdStateでは、widgetでウィジェットを参照できます。 YellowBirdにメンバー変数がある場合final String foo、コンパイラはwidget.fooは、YellowBirdのfooという文字列です。

15
Richard Heap