0

想象两个小部件:管理标签栏并因此包含多个小部件的 Main - 和 Dashboard。在主构造函数上,我创建了第一个仪表板实例和其他带有一些虚拟数据的选项卡栏小部件(同时在 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

颤振:初始化状态:空

颤振:didChangeDependencies:空

颤振:仪表板构造函数:MachineStatus.Manual <-这里的数据到达了futureBuilder

我怎样才能强迫国家重建?我尝试将 key 参数与 UniqueKey() 一起使用,但没有奏效。尽管我不知道如何在我的用例中使用它,但继承的小部件似乎也不是解决方案,因为子项仅在 ..ScreenState 中可用,但在更新的数据中不可用。

我可以想象通过使用 Stream: listen to messages 然后调用 setState() 来通知dashboardScreenState - 我认为,但这只是一种解决方法。

谁能帮助我:)?

4

1 回答 1

0

我知道我之前遇到过 if 语句的问题,请尝试:

return FutureBuilder(
    future: futureData,
    builder: (BuildContext context, AsyncSnapshot snapshot) {
      if (snapshot.hasData) { //use hasData
        DataType data  = snapshot.data; //Declare Values first
        tabs[0] = Dashboard(data);
      } else {
        return CircularProgressIndicator();
      }
    });
于 2020-06-30T10:33:44.603 回答