フラッターにおけるステートフルとステートレスウィジェットの関係は何か?


ステートフルウィジェットは、その寿命内に複数回描画することができます理由は、可変ウィジェットです.この記事では、我々はフラッターにおけるステートフルとステートレスウィジェットとの関係は何か?
フラッターにおけるステートフルとステートレスウィジェットの関係は何か?
ステートレスウィジェット自体が再構築することはできませんが、外部のイベントからできます.ステートフルウィジェットは.
しかし、任意の種類のウィジェットをいつでも再塗装することができます.
Statelessは、そのプロパティのすべてが不変であり、それらを変更する唯一の方法は、そのウィジェットの新しいインスタンスを作成することです.ウィジェットツリーをロックしません.
以下のようなイメージを考えてください.

ステートレスウィジェットとは
statelesswidget -変更可能な状態を必要としないウィジェット.
ステートレスウィジェットは、ユーザーインターフェイスをより具体的に記述する他のウィジェットのコンステレーションを構築することによって、ユーザーインターフェイスの一部を記述するウィジェットです.ユーザーインターフェイスの説明が完全に具体的になるまで、建物プロセスは再帰的に続いています.
Stateless Widgetは、あなたが記述しているユーザーインターフェースの一部がオブジェクト自体の構成情報以外のものに依存しない場合に便利です.動的に、例えば、内部のクロック駆動状態を持っているか、何らかのシステム状態によって変化することができる構成のために、statefulwidgetを使用することを考えてください.
class GreenFrog extends StatelessWidget {
  const GreenFrog({ Key key }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(color: const Color(0xFF2DBD3A));
  }
}
statefulwidget -変更可能な状態を持つウィジェット.
ステートフルウィジェットは、ユーザーインターフェイスの一部が動的に変更できる場合に便利です.
フラッタがstatefulwidgetを構築するとき、それは州オブジェクトをつくります.このオブジェクトは、そのウィジェットのすべての変更可能な状態が保持されます.
状態の概念は2つのものによって定義されます.
ウィジェットによって使用されるデータが変更される場合があります.
ウィジェットが構築されるとき、データは同期的に読むことができません.すべての状態は、ビルドメソッドが呼び出されるまでに確立されなければなりません.
ステータスウィジェットのライフサイクル:
createStates ()--ステータスウィジェットを生成するためにフラッタを指示すると、すぐにcreateState() ()を呼び出します.
ツリー内の指定された位置にこのウィジェットの変更可能な状態を作成します.
サブクラスは、このメソッドをオーバーライドして、関連する状態サブクラスの新しく作成されたインスタンスを返します.
@override
_MyState createState() => _MyState();
マウント= = true -すべてのウィジェットにはboolがあります.マウントプロパティ.buildContextが割り当てられるとき、それはtrueになります.ウィジェットのアンマウント時にsetstateを呼び出すのはエラーです.この状態オブジェクトが現在木にあるかどうか.
bool get mounted => _element != null;
initstate ()--ウィジェットが作成された際に呼び出される最初のメソッドです.initstats ()は一度だけ呼び出されます.それはスーパーを呼び出す必要があります.initstat ()も参照ください.
ウィジェットの生成されたインスタンスの特定のBuildContextに依存するデータを初期化します.
これらのウィジェットの親ウィジェットに依存するプロパティを初期化します.
ストリーム、changenotifiers、またはこのウィジェット上のデータを変更することができます他のオブジェクトを購読する.
@override
initState() {
  super.initState();
  // Add listeners to this class
  cartItemStream.listen((data) {
    _updateWidget(data);
  });
}
didChangeDependencies ()--この状態オブジェクトの依存性が変化するときに呼び出されます.
このメソッドはinitstats ()の直後にも呼び出されます.BuildContextを呼び出すのは安全です.このメソッドからInheritFromWidgetToExactType型を指定します.
フレームワークが依存関係変更後にビルドを常に呼び出しているため、サブクラスはこのメソッドをオーバーライドすることは稀です.いくつかのサブクラスでは、このメソッドをオーバーライドします.なぜなら、依存関係が変化したときには高価な仕事(例えばネットワークフェッチ)を行う必要があるからです.
@protected
@mustCallSuper
void didChangeDependencies() { }
build () -ウィジェットによって表されるユーザーインターフェイスの一部を説明します.
フレームワークはこのメソッドを複数の異なる状況で呼び出します.
initstat ()をコールした後.
didupdatewidgetを呼び出した後に.
setstateへの呼び出しを受けた後.
この状態オブジェクトの依存関係が変更された後は、以前のビルドの変更によって参照される継承ウィジェットが変更されます.
deactivateを呼び出した後、別の場所のツリーに状態オブジェクトを再挿入します.
このメソッドによって返されるウィジェットが既存のサブツリーを更新したり、サブツリーを削除したり、新しいサブツリーを展開することによって、このウィジェットの下にあるサブツリーを置き換えます.Canupdate
典型的には、このウィジェットのコンストラクタからの情報、指定されたビルドコンテキスト、およびこの状態オブジェクトの内部状態で構成されるウィジェットの新しく作成されたコンステレーションを返します.
didupdatewidget () -ウィジェットの設定が変更されるたびに呼び出されます.
親ウィジェットが再構築し、ツリー内のこの場所が同じランタイムタイプとウィジェットを持つ新しいウィジェットを表示するように要求する場合.キー、フレームワークはこの状態オブジェクトのウィジェットプロパティを更新し、新しいウィジェットを参照し、このメソッドを引数として前のウィジェットで呼び出します.
ウィジェットの変更時にこのメソッドをオーバーライドします(例えば、暗黙のアニメーションを開始する).
フレームワークは常にdidupdateWidgetを呼び出した後にビルドを呼び出します.これはdidupdatewidgetのsetstateへの呼び出しが冗長であることを意味します.
@mustCallSuper
@protected
void didUpdateWidget(covariant T oldWidget) { }
setstate ()-状態オブジェクトの内部状態を変更するたびに、setstateに渡す関数の変更を行います.setstateを呼び出すと、このサブツリー内のユーザーインターフェイスに影響を与える可能性のある方法で、このオブジェクトの内部状態が変更されたフレームワークを通知します.このサブツリーでは、フレームワークがこの状態オブジェクトのビルドをスケジュールします.
SetStateを呼び出すことなく直接状態を変更する場合、フレームワークはビルドをスケジュールしないかもしれません.また、このサブツリーのユーザーインターフェイスを更新しても、新しい状態を反映することはできません.
setState(() { _myState = newValue });
deactivate ():状態がツリーから削除されたときには、非アクティブ化が呼び出されますが、現在のフレーム変更が終了する前に再挿入されることがあります.このメソッドは、基本的には、ツリー内の1つの点から他の状態まで状態オブジェクトを移動できるためです.
フレームワークは、ツリーからこの状態オブジェクトを削除するたびに、このメソッドを呼び出します.場合によっては、フレームワークはツリーの他の部分に状態オブジェクトを再挿入します(例えば、この状態オブジェクトを含んでいるsubtreeが木の1つの位置からもう一つへ移植されるなら).それが起こるならば、フレームワークは州のオブジェクトに木のその新しい位置に適応する機会を与えるためにそれがビルドを呼ぶことを確実とします.
フレームワークがこのサブツリーを再挿入する場合、ツリーからサブツリーが削除されたアニメーションフレームの末尾の前に実行されます.この理由で、状態オブジェクトは、フレームワークがDispose ()メソッドを呼び出すまで、ほとんどのリソースを解放することができます.
これはほとんど使用されません.
@protected
@mustCallSuper
void deactivate() { }

dispose () -このオブジェクトが永続的に削除されたときに呼び出されます.
この状態オブジェクトが二度とビルドされない場合、フレームワークはこのメソッドを呼び出します.フレームワーク呼び出し後、状態オブジェクトはアンマウントされ、マウントされたプロパティはfalseです.この時点でsetstateを呼び出すのはエラーです.ライフサイクルのこの段階は端末です.破棄された状態オブジェクトを再マウントする方法はありません.
サブクラスは、このオブジェクトによって保持されたリソースを解放するためにこのメソッドをオーバーライドする必要があります.
@protected
@mustCallSuper
void dispose() {
  assert(_debugLifecycleState == _StateLifecycle.ready);
  assert(() { _debugLifecycleState = _StateLifecycle.defunct; return true; }());
}
以下のようなイメージを考えてください.

ステートレスウィジェット:ステートレスウィジェットの状態が1回だけ作成され、それは値を更新することができますが、明示的に状態がない.これはそれらの構造からも明らかである.それは、ステートレスウィジェットで拡張された1つのクラスだけを持っている理由です.それで、もし私が言うなら、build ()メソッドを再実行することはできません.
ステイトトフルウィジェット:ステイトトフルウィジェットは、ローカルの値を更新することができます&値を複数回イベントがトリガされます.その理由は、実装も異なっている.これには2つのクラスがあり、1つはstatefulwidgetで、もう一つは状態実装ハンドラです.それで、私が言うならば、彼らは、再び引き起こされるイベントに基づくbuild ()メソッドを再実行することができます.下の図は、より良い方法で同じことを理解するのに役立ちます.
Image description
まとめ
学習してください!ずぶぬれに!
それでも、フラッタ開発のためのサポートが必要ですか?あなたのフラッターの要件をお知らせください.
この記事では、我々はフラッターにおけるステートフルとステートレスウィジェットとの関係は何か?
FlutterAgency.comは、フラッタ技術とフラッター開発者に捧げられる我々のポータルプラットホームです.ポータルはフラッターウィジェットガイド、フラッタプロジェクト、コードLIBSなどのようなフラッターからクールなリソースがいっぱいです.