#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. Это зависит от обстоятельств. Когда вы хотите получить к ним доступ ? После каких-то действий ? откуда происходит это действие ?