[フラッター]か月間ウィジェットを使用してグローバル変数を実装



Using Inheritedwidget Implement Global Variables



私は最近、Flutterを使用してクロスプラットフォームアプリを作成することを研究しました。私は以前にJavaを使用してAndroidアプリケーションを作成することを学びましたが、Java言語に精通しており、FlutterはDart言語を使用して作成するため、Dart言語とFlutterフレームワークに精通しています。中国でも多くの問題が発生しています。

多くのオンライン情報と公式ドキュメントを読んだ後、Dartはグローバル変数をサポートしていないようです。Flutterはすべてをウィジェットに抽象化し、ステートフルステートフルウィジェットとステートレスステートレスウィジェットに分割します。各コントロールの変数は抽象化が状態状態になります。ステートフル状態が変化すると、コントロールが更新されて目的が変更されます。したがって、問題は、複数のコントロールによって共有される状態を定義する方法に変換されます。たとえば、Flutterが提供するAliExpressWidgetは、グローバル変数のような関数を実装できます。 。



か月間ウィジェット

着用ウィジェットは、ウィジェットツリーで情報を効果的に伝達するために使用されるウィジェットの基本クラスです。着用ウィジェットの子コントロールは、祖先ノードで自分自身に最も近い継承ウィジェットコントロールを自動的に検索し、継承ウィジェットコントロールの変数を取得するため、グローバル変数を定義するだけで済みます。か月間ウィジェットで、変数を共有する必要がある祖先ノードとして、継承ウィジェットコントロールを使用します。

公式の例を見てみましょう:



class FrogColor extends InheritedWidget { const FrogColor({ Key key, @required this.color, @required Widget child, }) : assert(color != null), assert(child != null), super(key: key, child: child) final Color color static FrogColor of(BuildContext context) { return context.inheritFromWidgetOfExactType(FrogColor) as FrogColor } @override bool updateShouldNotify(FrogColor old) => color != old.color }

ここで、Colorは共有変数です

ofメソッドは、BuildContext.inheritFromWidgetOfExactTypeを呼び出してFrogColorコンポーネントを返す静的メソッドです。もちろん、保存された共有変数Colorなどのデータを返すこともできます。

updateShouldNotifyメソッドは、コントロールの更新ロジックです。上記のメソッド本体は、色の値が変更されたときにコントロールが更新されることを示しています。



第二に、変数変数の共有

公式に提供された例はfinalで変更されているため、子コントロールはその値を変更できません。変数を作成する場合は、冒頭で説明した状態を使用して、StatefulWidgetをHeriatedWidgetに保存できます。このStatefulWidgetを使用して、保存する変数を管理できます。

class _SharedInherited extends InheritedWidget { _SharedInherited({ Key key, @required Widget child, @required this.data, }) : super(key: key, child: child) Final SharedInheritedWidgetState data //Save data via a StatefulWidgetState @override Bool updateShouldNotify(_SharedInherited oldWidget) { //Data update return data != oldWidget.data } } class SharedInheritedWidget extends StatefulWidget { SharedInheritedWidget({ Key key, this.child, }) : super(key: key) final Widget child @override SharedInheritedWidgetState createState() => new SharedInheritedWidgetState() static SharedInheritedWidgetState of(BuildContext context) { return (context.inheritFromWidgetOfExactType(_SharedInherited) as _SharedInherited) .data } } class SharedInheritedWidgetState extends State { String _sharedVal = '' //Shared variable void setSharedVal(String newVal) { setState(() { _sharedVal = newVal }) } String getSharedVal() { return _sharedVal } @override Widget build(BuildContext context) { return _SharedInherited(child: widget.child, data: this) } }