Виджет с состоянием в теле Scaffold - PullRequest
0 голосов
/ 03 октября 2018

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

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

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

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

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

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

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

ОБНОВЛЕНИЕ:

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

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 Ответ

0 голосов
/ 04 октября 2018

Вы не должны передавать параметры из родительского класса виджета в его состояние - вы можете получить к ним доступ через директиву "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),
    );
  }
}
...