Как поместить границу в определенный контейнер с помощью GestureDetector и нескольких контейнеров

#flutter #dart

Вопрос:

У меня есть переменное число Container s, созданное кнопкой. Эти Container s обернуты, GestureDetector чтобы их можно было перетаскивать. Но у меня есть проблема, потому что я хотел бы поместить границу в текущий выбранный контейнер. Вот что я пытался сделать:

Здесь есть код Container созданного:

   @override
  Widget build(BuildContext context) {
    return Positioned(
      top: yPosition,
      left: xPosition,
      child: GestureDetector(
        onPanUpdate: (tapInfo) {
          setState(() {
            xPosition  = tapInfo.delta.dx;
            yPosition  = tapInfo.delta.dy;
            widget.selectedSectionContainer(widget.key, widget.isSelected);

          });
        },
        onTap: () => setState(() {
          widget.selectedSectionContainer(widget.key, widget.isSelected);

        }),
        child: Container(
          decoration: BoxDecoration(
            border: Border.all(
                color: widget.isSelected ? Colors.black : Colors.transparent,
                width: 5),
            color: widget.color,
          ),
        ),
      ),
    );
  }
 

вот код в другом классе, где я пытаюсь установить isSelected Container :

 selectedSectionContainer: (Key key, bool isSelected) => setState(() {
        
          if (_currentSelectedContainerKey != key) {
            isSelected = true;
            _isSelected = isSelected;
            _currentSelectedContainerKey = key;
            updateSectionContainer(key);
          } else {
            isSelected = false;

            updateSectionContainer(key);
          }
 

таким образом, все контейнеры имеют границу, в то время как вместо этого мне просто нужно было бы поместить границу в выбранный

Кто-нибудь может мне любезно помочь? Спасибо

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

1. Флаттер имеет тенденцию выдувать событие через дерево, если ваши контейнеры перекрываются, это ваша проблема ? Также опубликуйте больше кода. Так как трудно понять, что вы делаете внутри виджета контроллера.

2. здесь приведен полный код двух классов pastebin.com/CNfs5ETG @Нисант Редди

3. моя проблема заключается только в том , чтобы поставить границу для текущего выбранного SectionContainer , с помощью моего кода я могу получить Key выбранное SectionContainer , но тогда я не знаю, как поставить границу на нем

4. В коде отсутствуют некоторые части. Ты хочешь сказать, что widget.isSelected это всегда true так ?

5. Каких частей не хватает? «Да» — это всегда true

Ответ №1:

В вашем DashboardScreenState случае вы сохраняете только 1 bool _isSelected в качестве состояния того Container , выбрано a или нет. Но ваши фактические данные о which выбранном контейнере присутствуют в _currentSelectedContainerKey .

Таким образом, вы не можете просто перейти _isSelected в одиночку во все ваши контейнеры , так как, когда один из них выбран и _isSelected установлен в true значение, все контейнеры думают, что они выбраны.

Чтобы избежать этого, начните передавать свое _currentSelectedContainerKey в свое SectionContainer вместе со _isSelected своим .

Итак, добавьте это в свой SectionContainer ,

 final bool isSelected;
final Key currentSelectedContainerKey; // Add this line in the class

required this.isSelected,
required this.currentSelectedContainerKey, // Add this line in constructor
 

Затем передайте это во SectionContainer время создания их в своем loadSectionContainers и addSectionContainer . (в основном там, где вы создаете новое SectionContainer .

 isSelected: _isSelected,
currentSelectedContainerKey: _currentSelectedContainerKey // Start passing this
 

Теперь, наконец, измените свой border код на этот,

 border: Border.all(
            color: widget.currentSelectedContainerKey == widget.key amp;amp; widget.isSelected ? Colors.black : Colors.transparent,
            width: 5),
 

Это не тот best подход, но он решит вашу проблему.
Надеюсь, вы поняли мое объяснение.

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

1. Большое вам спасибо!!! так добр! Почему вы сказали, что это не лучший подход?

2. Потому что мы поддерживаем а Key как государство. Key это более полезно, когда мы хотим сохранить состояние виджетов или какое-либо другое сложное свойство. Здесь мы могли бы просто использовать какой String -нибудь идентификатор, и он будет функционировать точно так же. Никаких серьезных проблем с использованием ключей.

3. И рад, что помог 🙂

4. Извините, просто еще одна мелочь, если бы я хотел из своего DashboardScreenState получить доступ к xPosition и yPosition в SectionContainerState , как я мог бы это сделать?

5. Это зависит от обстоятельств. Когда вы хотите получить к ним доступ ? После каких-то действий ? откуда происходит это действие ?