Flutter: виджет с отслеживанием состояния не обновляется

Представьте себе два виджета: основной, который управляет панелью вкладок и, следовательно, содержит несколько виджетов, и панель инструментов. В главном конструкторе я создаю первый экземпляр панели инструментов и другие виджеты панели вкладок с некоторыми фиктивными данными (тем временем они загружаются в initState). Я строю их с помощью Futurebuilder. Как только данные будут получены, я хочу создать новый экземпляр Dashboard, но он не изменится.

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

flutter: didChangeDependencies: null

flutter: Dashboard Constructor: MachineStatus.Manual ‹- Здесь данные поступили в futureBuilder

Как я могу заставить государство воссоздать? Я пытался использовать ключевой параметр с UniqueKey (), но это не сработало. Также унаследованный виджет, похоже, тоже не является решением, несмотря на то, что я не знаю, как использовать его в моем случае использования, потому что дочерний элемент доступен только в ..ScreenState, но не в обновленных данных ..

Я мог бы представить, как информировать dashboardScreenState с помощью Stream: прослушивать сообщения, а затем вызывать setState () - я думаю, но это только обходной путь.

Кто-нибудь может мне помочь :)?


person CAoT    schedule 30.06.2020    source источник


Ответы (1)


Я знаю, что раньше у меня были проблемы с оператором 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();
      }
    });
person Jackson Lee    schedule 30.06.2020
comment
Вы не должны вызывать setState () или markNeedsBuild () внутри сборки. Уже пробовал .. - person CAoT; 02.07.2020
comment
Я изменил свой ответ - взгляните - person Jackson Lee; 02.07.2020
comment
Все еще не работает: / Я также попытался назначить данные моментального снимка локальным переменным, хранящимся в main, и передать их в первый и второй экземпляры Dashboard. Таким образом, первый экземпляр получает нулевые значения, а второй - полученные данные. Тоже не работает .. - person CAoT; 02.07.2020