StatefulWidgetの外から状態を制御する
質問
StatefulWidgetの状態をWidgetの状態の外側で制御するためのベストプラクティスを理解しようとしています。
私は以下のインターフェイスを定義しています。
abstract class StartupView {
Stream<String> get onAppSelected;
set showActivity(bool activity);
set message(String message);
}
StatefulWidgetを作成したい。
StartupPage
を作りたいと思います。このWidgetは次のようなことを期待します。
-
ボタンが押されると、onAppSelectedストリームでイベントが送信されます。コントローラはこのイベントを聞き、何らかのアクション(データベース呼び出し、サービス要求など)を実行します。
-
コントローラは
showActivity
またはset message
を使用すると、ビューにメッセージとともに進行状況を表示させることができます。
Stateful WidgetはプロパティとしてStateを公開しないので、Stateの属性にアクセスして変更するための最良の方法がわかりません。
私が期待する使い方は、次のようなものです。
Widget createStartupPage() {
var page = new StartupPage();
page.onAppSelected.listen((app) {
page.showActivity = true;
//Do some work
page.showActivity = false;
});
}
で返したい状態を渡してWidgetをインスタンス化することを考えてみました。
createState()
に渡すことでインスタンス化することも考えましたが、それは間違っているように感じます。
なぜ私たちがこのようなアプローチをとっているのか、いくつかの背景を説明します。現在、私たちはDartのWebアプリケーションを持っています。ビューとコントローラーの分離、テスト容易性、そしてFlutterへの前向きな考えのために、私たちはアプリケーション内のすべてのビューに対してインターフェースを作成することに決めました。これにより、WebComponentやFlutter Widgetがこのインターフェイスを実装し、すべてのコントローラロジックを同じにすることができるようになります。
どのように解決するのか?
静的メソッドで状態のウィジェットを公開することができます。flutterのサンプルのいくつかはこの方法をとっており、私もそれを使うようになりました。
class StartupPage extends StatefulWidget {
static _StartupPageState of(BuildContext context) => context.ancestorStateOfType(const TypeMatcher<_StartupPageState>());
@override
_StartupPageState createState() => new _StartupPageState();
}
class _StartupPageState extends State<StartupPage> {
...
}
次に、この状態にアクセスするには
StartupPage.of(context).doSomething();
.
ここでの注意点は、そのページを持つBuildContextをそのツリーのどこかに持っている必要があることです。
関連
-
[解決済み] FlutterでButtonを無効にするには?
-
[解決済み] Navigatorを含まないコンテキストで要求されたNavigator操作
-
[解決済み] FlutterのprimaryColorとprimarySwatchの違いは何ですか?
-
[解決済み] Flutterで複数のウィジェットをレンダリングするためにリストを反復処理する?
-
[解決済み] TextFormFieldとTextFieldの違いは何ですか?
-
[解決済み] Flutter: 静的ターゲットが見つからない場合の未実装の処理
-
[解決済み] DartのNull Safetyとは何ですか?
-
[解決済み] 親のサイズに基づいてウィジェットをレイアウトするには?
-
yield' キーワードは flutter で何をするのですか?
-
flutterのテキスト編集フィールドを無効化する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] TextFieldの高さと幅を変更するには?
-
[解決済み] Flutterにおける変数名の前のアンダースコア"_"の意味するところ
-
[解決済み] 丸みを帯びたボーダーを持つボタンを作成する [重複]。
-
[解決済み] Flutterで他のStatefulWidgetの状態を設定/更新するには?
-
[解決済み] DartのNull Safetyとは何ですか?
-
[解決済み] flutterから.apkと.ipaファイルを取得する方法は?
-
[解決済み] 親のサイズに基づいてウィジェットをレイアウトするには?
-
[解決済み] dartで日付に月/年を加算/減算する?
-
[解決済み] Flutterで画面間のデータを受け渡す
-
[解決済み] AnimationController 名前付きパラメータ 'vsync' が定義されていません。