0

タブバーを管理し、複数のウィジェットを保持するメインと、ダッシュボードの 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() を呼び出します。

誰か助けてください:)?

4

1 に答える 1