Виджет с состоянием в теле Scaffold

Я не понимаю, почему во флаттере невозможно иметь такую ​​структуру:

//...
Scaffold(
  //...
  body: myPage(dataList[index])
)
//...

Где myPage - это класс, который расширяет statefulWidget и возвращает ListView. Требуется параметр данных, который хранится в массиве. Я хочу изменить тело моего леса, когда я изменяю индекс, например, с помощью навигационного ящика.

Я заметил, что:

  • если myPage расширяет statelessWidget все работает нормально,
  • если у меня есть разные классы страниц, которые расширяют statefulWidget все работает нормально,
  • но если у меня есть myPage, который требует данных для изменения содержимого, ничего не происходит, он не меняется, он остается на первой странице

И да, я использовал метод setState для обновления макета при каждом изменении индекса.

Это ошибка или я что-то пропустил? Если это не ошибка, что я могу сделать в качестве обходного пути? заранее спасибо

ОБНОВИТЬ:

Я выкладываю код другой страницы, где нет ничего странного, где есть такая проблема (я знаю, что на этой странице я мог бы использовать statelessWidget, но он все равно должен работать):

class FirstFragment extends StatefulWidget {
  String data;
  FirstFragment(this.data);

  @override
  _FirstFragment createState() => new _FirstFragment(data);

}

class _FirstFragment extends State<FirstFragment>{
  String data;
  _FirstFragment(this.data);

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return new Center(
      child: new Text(data),
    );
  }
}

1 ответ

Решение

Вы не должны передавать параметры из родительского класса виджета в его состояние - вы можете получить к ним доступ через директиву "widget". Кроме того, слушайте Lint - все экземпляры должны быть окончательными в основном классе.

class FirstFragment extends StatefulWidget {
  final String data;
  FirstFragment(this.data);

  @override
  _FirstFragment createState() => new _FirstFragment();

}

class _FirstFragment extends State<FirstFragment>{


  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return new Center(
      child: new Text(widget.data),
    );
  }
}
Другие вопросы по тегам