Виджет с состоянием в теле 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),
);
}
}