StatefulWidgetとStatelessWidget。
StatelessWidget-可変状態を必要としないウィジェット。
ステートレスウィジェットは、ユーザーインターフェイスをより具体的に説明する他のウィジェットのコンステレーションを構築することにより、ユーザーインターフェイスの一部を説明するウィジェットです。構築プロセスは、ユーザーインターフェイスの説明が完全に具体的になるまで再帰的に続行されます(たとえば、具体的なRenderObjectを説明するRenderObjectWidgetsで完全に構成されます)。
stateless
ユーザーの一部あなたが記述されているインタフェースは、オブジェクト自体と内の構成情報以外に依存していないとき、ウィジェットは便利です
BuildContextウィジェットが膨張しています。内部クロック駆動状態があるため、またはシステム状態に応じて動的に変化する可能性のある構成の場合は、の使用を検討してください
StatefulWidget
。
class GreenFrog extends StatelessWidget {
const GreenFrog({ Key key }) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(color: const Color(0xFF2DBD3A));
}
}
StatefulWidget-状態が変更可能なウィジェット。
- ステートフルウィジェットは、説明しているユーザーインターフェイスの一部が動的に変更される可能性がある場合に役立ちます。
Flutterがを構築するStatefulWidget
と、Stateオブジェクトが作成されます。このオブジェクトは、そのウィジェットのすべての可変状態が保持される場所です。
状態の概念は、次の2つのことによって定義されます。
1)ウィジェットが使用するデータが変更される場合があります。
2)ウィジェットの作成時にデータを同期的に読み取ることができません。(すべての状態は、buildメソッドが呼び出されるまでに確立される必要があります)。
StatefulWidgetのライフサイクル
ライフサイクルには、次の簡略化された手順があります。
- createState() -FlutterがStatefulWidgetを構築するように指示されると、すぐに
createState()
。を呼び出します。
@override
_MyState createState() => _MyState();
- Mounted == true-すべてのウィジェットにはbool
this.mounted
プロパティがあります。buildContext
が割り当てられるとtrueになります。setState
ウィジェットがアンマウントされているときに呼び出すとエラーになります。このStateオブジェクトが現在ツリー内にあるかどうか。
Stateオブジェクトを作成した後、を呼び出す前initState
に、フレームワークはStateオブジェクトを。に関連付けて「マウント」します
BuildContext
。状態オブジェクトは、フレームワークが
呼び出すまでマウントされたままになりますdispose()
。その後、フレームワークは
状態オブジェクトに再構築を要求しません。
マウントがtrueでない限り、setStateを呼び出すとエラーになります。
bool get mounted => _element != null;
- initState() -これは、ウィジェットが作成されたときに呼び出される最初のメソッドです(もちろん、クラスコンストラクターの後)。
initState
一度だけ呼び出されます。それは呼び出す必要がありますsuper.initState().
ウィジェットの作成されたインスタンスの特定のBuildContextに依存するデータを初期化します。
ツリー内のこれらのウィジェット「親」に依存するプロパティを初期化します。
Streams 、、、ChangeNotifiers
またはこのウィジェットのデータを変更する可能性のあるその他のオブジェクトをサブスクライブします。
@override
initState() {
super.initState();
cartItemStream.listen((data) {
_updateWidget(data);
});
}
- didChangeDependencies() -このStateオブジェクトの依存関係が変更されたときに呼び出されます。
このメソッドは、の直後にも呼び出されinitState
ます。BuildContext.inheritFromWidgetOfExactType
このメソッドから呼び出しても安全です。
フレームワークは依存関係の変更後に常にbuildを呼び出すため、サブクラスがこのメソッドをオーバーライドすることはめったにありません。一部のサブクラスは、依存関係が変更されたときにコストのかかる作業(ネットワークフェッチなど)を実行する必要があり、その作業はすべてのビルドで実行するにはコストがかかりすぎるため、このメソッドをオーバーライドします。
@protected
@mustCallSuper
void didChangeDependencies() { }
- build() -ウィジェットによって表されるユーザーインターフェイスの部分を記述します。
フレームワークは、さまざまな状況でこのメソッドを呼び出します。
- 呼び出し
initState
た後。
- 呼び出し
didUpdateWidget
た後。
- への電話を受けた後
setState
。
- このStateオブジェクトの依存関係が変更された後(たとえば、前のビルドで参照されたわずか
- deactivateを呼び出した後、Stateオブジェクトをツリーの別の場所に再挿入します。
フレームワークは、このメソッドによって返されるウィジェットが既存のサブツリーのルートを更新できるかどうかに応じて、既存のサブツリーを更新するか、サブツリーを削除して新しいサブツリーを拡張することにより、このウィジェットの下のサブツリーをこのメソッドによって返されるウィジェットに置き換えます。 、を呼び出すことによって決定され
Widget.canUpdate
ます。
通常、実装は、このウィジェットのコンストラクター、指定されたBuildContext、およびこのStateオブジェクトの内部状態からの情報で構成された新しく作成されたウィジェットのコンステレーションを返します。
@override
Widget build(BuildContext context, MyButtonState state) {
... () { print("color: $color"); } ...
}
- didUpdateWidget() -ウィジェットの構成が変更されるたびに呼び出されます。
親ウィジェットを再構築し、ツリー内のこの場所を更新して、同じランタイムタイプとWidget.keyを持つ新しいウィジェットを表示するように要求すると、フレームワークはこのStateオブジェクトのウィジェットプロパティを更新して、新しいウィジェットを参照し、これを呼び出します。前のウィジェットを引数として持つメソッド。
このメソッドをオーバーライドして、ウィジェットが変更されたときに応答します(たとえば、暗黙的なアニメーションを開始します)。
フレームワークは、didUpdateWidgetを呼び出した後、常にbuildを呼び出します。つまり、didUpdateWidgetでのsetStateの呼び出しは冗長です。
@mustCallSuper
@protected
void didUpdateWidget(covariant T oldWidget) { }
- setState() -Stateオブジェクトの内部状態を変更するときはいつでも、渡す関数に変更を加えます
setState
。
setStateを呼び出すと、このサブツリーのユーザーインターフェイスに影響を与える可能性のある方法でこのオブジェクトの内部状態が変更されたことがフレームワークに通知され
ます。これにより、フレームワークはこのStateオブジェクトのビルドをスケジュールします。
setStateを呼び出さずに状態を直接変更した場合、フレームワークがビルドをスケジュールせず、このサブツリーのユーザーインターフェイスが新しい状態を反映するように更新されない可能性があります。
setState(() { _myState = newValue });
- deactivate() -状態がツリーから削除されると非アクティブ化が呼び出されますが、現在のフレーム変更が完了する前に再挿入される場合があります。このメソッドは基本的に、Stateオブジェクトをツリー内のあるポイントから別のポイントに移動できるために存在します。
- フレームワークは、このStateオブジェクトをツリーから削除するたびに、このメソッドを呼び出します。場合によっては、フレームワークはStateオブジェクトをツリーの別の部分に再挿入します(たとえば、このStateオブジェクトを含むサブツリーがツリー内のある場所から別の場所に移植されている場合)。その場合、フレームワークはbuildを呼び出して、Stateオブジェクトがツリー内の新しい場所に適応する機会を与えるようにします。フレームワークがこのサブツリーを再挿入する場合、サブツリーがツリーから削除されたアニメーションフレームが終了する前に再挿入します。このため、Stateオブジェクトは、フレームワークがdisposeメソッドを呼び出すまで、ほとんどのリソースの解放を延期できます。
これはめったに使用されません。
@protected
@mustCallSuper
void deactivate() { }
- dispose() -このオブジェクトがツリーから完全に削除されたときに呼び出されます。
このStateオブジェクトが二度とビルドされない場合、フレームワークはこのメソッドを呼び出します。フレームワークがを呼び出したdispose()
後、Stateオブジェクトはマウントされていないと見なされ、マウントされたプロパティはfalseです。この時点でsetStateを呼び出すのはエラーです。ライフサイクルのこの段階は最終的なものです。破棄されたStateオブジェクトを再マウントする方法はありません。
サブクラスは、このメソッドをオーバーライドして、このオブジェクトによって保持されているリソースを解放する必要があります(たとえば、アクティブなアニメーションを停止します)。
@protected
@mustCallSuper
void dispose() {
assert(_debugLifecycleState == _StateLifecycle.ready);
assert(() { _debugLifecycleState = _StateLifecycle.defunct; return true; }());
}
詳しくは行くここ 、ここ、ここに