Как предотвратить переопределение содержимого друг друга несколькими виджетами состояния (слайдерами изображений)?

#flutter #state #statefulwidget

#flutter #состояние #statefulwidget

Вопрос:

Итак, я пытаюсь разместить три ImageSliders на одной странице / карточке. Они очень похожи, поэтому я создал один класс и просто хотел передать изменяющиеся значения.

На самом деле это сработало не так, как предполагалось: теперь есть только три раза последний вызванный слайдер.

Я решил, что это, вероятно, то же самое состояние, которое перезаписывается, и попытался передать уникальный ключ.

Однако ничего не изменилось.

Ползунок:

 List<String> _imgList;
List<String> _nameList;
String _description;

class ShopListSlider extends StatefulWidget {
  ShopListSlider(
      {Key key,
      String description,
      @required List<String> imgList,
      @required List<String> nameList})
      : super(key: key) {
    _imgList = imgList;
    _nameList = nameList;
    _description = description;
  }

  @override
  _ShopListSliderState createState() => _ShopListSliderState();
}

class _ShopListSliderState extends State<ShopListSlider> {
  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Container(...);
 }
}
 

Содержимое виджета, вызывающего слайдер (ы):

 child: Column(children: [
          SizedBox(height: 50),
          ShopListSlider(
              key: UniqueKey(),
              description: "Restaurants in Deiner Nähe",
              imgList: imgListNear,
              nameList: nameListNear),
          SizedBox(height: 50),
          ShopListSlider(
              key: UniqueKey(),
              description: "Beliebte Restaurants",
              imgList: imgListBest,
              nameList: nameListBest),
          SizedBox(height: 50),
          ShopListSlider(
              key: UniqueKey(),
              description: "Deine Favoriten",
              imgList: imgListFavorites,
              nameList: nameListFavorites),
        ]),
 

Ответ №1:

Это будет работать нормально без каких-либо ключей.

Проблема в том, что переменные вашего класса не находятся внутри класса, они находятся на уровне пакета, что в основном означает, что все виджеты не имеют состояния, разделяя некоторое глобальное состояние.

Просто переместите их в состояние и удалите эти ключи:

 class _ShopListSliderState extends State<ShopListSlider> {
   List<String> _imgList;
   List<String> _nameList;
   String _description;
 

Fwiw, подобное использование uniqueKey() приведет к перестройке виджета everysingle build(), независимо от того, изменено оно или нет, что на самом деле не то, что вы хотите.

Комментарии:

1. Спасибо! Это сработало отлично. Я даже узнал о доступе к данным из состояния через widget.data. Спасибо, чувак! 🙂