#flutter #listview #dart #gesturedetector
#flutter #listview #dart #gesturedetector
Вопрос:
Не могу понять, как решить эту проблему. Итак, вот простейший код, который представляет мою проблему:
Scaffold(
body: Stack(
children: <Widget>[
...
Scrollbar(
child: ListView.builder(
primary: false,
shrinkWrap: true,
itemCount: _mapBloc?.mapData?.companies?.count ?? 0,
itemBuilder: (context, index) {
final company = _mapBloc?.mapData?.companies?.data[index];
return InkWell(
child: Hero(
tag: company.id,
child: Card(
child: Container(
height: 50,
width: double.infinity,
),
),
),
onTap: () {
Navigator.of(context)
.pushNamed('/company', arguments: company)
.then(
(results) {
if (results is PopWithResults) {
PopWithResults popResult = results;
}
},
);
},
);
},
),
)
],
),
);
И трассировка стека:
The following assertion was thrown during a scheduler callback:
There are multiple heroes that share the same tag within a subtree.
Within each subtree for which heroes are to be animated (i.e. a PageRoute subtree), each Hero must
have a unique non-null tag.
...
Количество элементов в ListView меняется с каждым запросом к базе данных. Если размер до 5 виджетов в ListView, то нажатие работает правильно, как только список расширяется, например, до 8 элементов, я получаю ошибку, написанную выше. С чем это может быть связано? Я пытался использовать уникальные теги героев, но это не решает проблему.
Мне нужен совет, и я надеюсь, что вы сможете мне помочь. Если вам нужна дополнительная информация, пожалуйста, напишите комментарий.
Спасибо за ваше внимание!
Комментарии:
1. У вас есть несколько компаний, которые имеют одинаковый тег
id
?tag: company.id,
должно быть уникальным, поэтому в вашем списке не должно быть двух одинаковых компанийid
. Это требование виджета Hero. И обратите внимание, он должен быть уникальным не только в этом конкретном ListView, но и во всем текущем экране (возможно, в вашем эшафоте). Используете ли вы другой виджет героя где-нибудь еще в своем коде?2. Спасибо за ваш ответ! Решение было в другом виджете героя без тега, о котором я просто забыл.