タブバーを管理し、複数のウィジェットを保持するメインと、ダッシュボードの 2 つのウィジェットを想像してください。メイン コンストラクターで、ダッシュボードの最初のインスタンスと、いくつかのダミー データを含む他のタブバー ウィジェットを作成します (その間、initState でフェッチされます)。私は Futurebuilder でこれらを構築します。データが到着したら、ダッシュボードの新しいインスタンスを作成したいのですが、変更されません。
class _MainState extends State<HomePage> {
var _tabs = <Widget>[];
Future<dynamic> futureData;
_MainState() {
_tabs.add(Dashboard(null));
}
@override
void initState() {
super.initState();
futureData = _getData();
}
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: futureData,
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.data != null) {
tabs[0] = Dashboard(snapshot.data);
} else {
return CircularProgressIndicator();
}
});
}
}
class DashboardScreen extends StatefulWidget {
final data;
DashboardScreen(this.data,
{Key key})
: super(key: key) {
print('Dashboard Constructor: ' + data.toString());
}
@override
_DashboardScreenState createState() => _DashboardScreenState(data);
}
class _DashboardScreenState extends State<DashboardScreen> {
var data;
_DashboardScreenState(this.data);
@override
void initState() {
super.initState();
print('InitState: ' + data.toString());
}
@override
void didUpdateWidget(Widget oldWidget) {
super.didUpdateWidget(oldWidget);
print('didUpdateWidget');
}
@override
void didChangeDependencies() {
super.didChangeDependencies();
print('didChangeDependencies' + data.toString());
}
@override
Widget build(BuildContext context) {
return Text(data.toString());
}
}
いくつかの利用可能なメソッドを印刷すると、DasboardScreenState が再作成されていないことが明らかになります。データが到着したときに DashboardScreen コンストラクターのみが再度呼び出されますが、状態ではありません...
フラッター: MainConstructor: null
flutter: ダッシュボード コンストラクタ: null
フラッター: InitState: null
フラッター: didChangeDependencies: null
flutter: Dashboard Constructor: MachineStatus.Manual <- ここでデータが futureBuilder に到着しました
どうすれば州に再建を強制できますか? UniqueKey() で key パラメータを使用しようとしましたが、うまくいきませんでした。また、子は ..ScreenState でのみ使用でき、更新されたデータでは使用できないため、継承されたウィジェットも解決策ではないようです..
Stream: を使用して、dashboardScreenState に通知することを想像できます。メッセージをリッスンしてから setState() を呼び出します。
誰か助けてください:)?