[解決済み] ポップアップ時にFlutterナビゲータの状態を再読み込みするように強制する
質問
私は1つ持っています
StatefulWidget
を持つFlutterで、このボタンが別の
StatefulWidget
を使って
Navigator.push()
. 2番目のウィジェットでは、グローバルな状態(いくつかのユーザー設定)を変更しています。2 番目のウィジェットから 1 番目のウィジェットに戻るときに
Navigator.pop()
最初のウィジェットは古い状態ですが、強制的に再読み込みしたいのです。どうすればいいのでしょうか?私は一つのアイデアを持っていますが、それは醜く見えます。
- 2番目のウィジェット(現在のウィジェット)を削除するポップ
- 最初のウィジェット(前のウィジェット)を削除するには、もう一度ポップします。
- 最初のウィジェットを押す (強制的に再描画する)
解決するには?
ここでできることは2つあります。Mahiさんの回答は正しいのですが、もう少し簡潔で、OPが質問したshowDialogではなく、実際にpushを使っています。これは
Navigator.push
:
import 'package:flutter/material.dart';
class SecondPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
color: Colors.green,
child: Column(
children: <Widget>[
RaisedButton(
onPressed: () => Navigator.pop(context),
child: Text('back'),
),
],
),
);
}
}
class FirstPage extends StatefulWidget {
@override
State<StatefulWidget> createState() => new FirstPageState();
}
class FirstPageState extends State<FirstPage> {
Color color = Colors.white;
@override
Widget build(BuildContext context) {
return new Container(
color: color,
child: Column(
children: <Widget>[
RaisedButton(
child: Text("next"),
onPressed: () async {
final value = await Navigator.push(
context,
MaterialPageRoute(
builder: (context) => SecondPage()),
),
);
setState(() {
color = color == Colors.white ? Colors.grey : Colors.white;
});
},
),
],
),
);
}
}
void main() => runApp(
MaterialApp(
builder: (context, child) => SafeArea(child: child),
home: FirstPage(),
),
);
しかし、あなたのユースケースによく合うかもしれない、別の方法があります。もしあなたが
global
を最初のページのビルドに影響を与えるものとして使用することができます。
継承されたウィジェット
を使用してグローバルなユーザープリファレンスを定義し、それらが変更されるたびにFirstPageが再構築されます。これは、以下に示すように、ステートレスウィジェット内でも動作します (ただし、ステートフルウィジェットでも動作するはずです)。
flutterのinheritedWidgetの例として、アプリのThemeがありますが、このように直接ビルドさせるのではなく、ウィジェット内で定義しています。
import 'package:flutter/material.dart';
import 'package:meta/meta.dart';
class SecondPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
color: Colors.green,
child: Column(
children: <Widget>[
RaisedButton(
onPressed: () {
ColorDefinition.of(context).toggleColor();
Navigator.pop(context);
},
child: new Text("back"),
),
],
),
);
}
}
class ColorDefinition extends InheritedWidget {
ColorDefinition({
Key key,
@required Widget child,
}): super(key: key, child: child);
Color color = Colors.white;
static ColorDefinition of(BuildContext context) {
return context.inheritFromWidgetOfExactType(ColorDefinition);
}
void toggleColor() {
color = color == Colors.white ? Colors.grey : Colors.white;
print("color set to $color");
}
@override
bool updateShouldNotify(ColorDefinition oldWidget) =>
color != oldWidget.color;
}
class FirstPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
var color = ColorDefinition.of(context).color;
return new Container(
color: color,
child: new Column(
children: <Widget>[
new RaisedButton(
child: new Text("next"),
onPressed: () {
Navigator.push(
context,
new MaterialPageRoute(builder: (context) => new SecondPage()),
);
}),
],
),
);
}
}
void main() => runApp(
new MaterialApp(
builder: (context, child) => new SafeArea(
child: new ColorDefinition(child: child),
),
home: new FirstPage(),
),
);
継承されたウィジェットを使用すれば、プッシュしたページのポップアップを監視する心配はありません。これは基本的なユースケースには有効ですが、より複雑なシナリオでは問題が発生する可能性があります。
関連
-
[解決済み] AppBarの先頭のアイコンの大きさを大きくする方法
-
flutter,コマンド PhaseScriptExecution が 0 以外の終了コードで失敗しました。
-
[解決済み] Flutterで丸みを帯びたボタン/border-radius付きボタンを作成する
-
WindowsでFlutterを設定する際にAndroidのライセンス状態がわからない
-
[解決済み】flutterのwrap_contentとmatch_parentに相当するもの?
-
[解決済み] ボタンの幅を親と同じにするには?
-
[解決済み] Flutterでボタンの幅と高さを設定する方法は?
-
[解決済み] フラッターは2つのアイテムを左と右の両極端に配置します。
-
[解決済み] Flutter 継承されたウィジェットを正しく使うには?
-
[解決済み] TextFieldの外や画面上の任意の場所をクリックした後、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 実装 サイバーパンク風ボタン
おすすめ
-
Solve flutter Android ライセンスの状態が不明です。Android SDK Managerを再インストールまたはアップデートしてみてください。
-
[解決済み】Scaffold.of()がScaffoldを含まないコンテキストで呼び出された場合
-
[解決済み】Flutterで角丸画像を作成する方法
-
[解決済み】Flutterでウィジェットをプログラム的に表示・非表示にする方法
-
[解決済み】Flutterで少し遅れてからコードを実行する方法は?
-
[解決済み] appBarのバックボタンの色を変更する方法
-
[解決済み] ポップアップ時にFlutterナビゲータの状態を再読み込みするように強制する
-
[解決済み] ListViewの最後までプログラム的にスクロールさせる
-
[解決済み] FlutterError: アセットをロードできない
-
[解決済み] TextFieldの外や画面上の任意の場所をクリックした後、flutterのソフト入力キーボードを非表示にする方法は?