Ползунок висит, если сдвигается много предметов
У меня есть горизонтальный список из 10000 элементов, и для прокрутки я использую ползунок флаттера, но он совсем не гладкий. Я думаю, что установка состояния на сменном клапане - неправильный способ.
Slider(
key: ValueKey('slider'),
activeColor: Colors.blue,
inactiveColor: Colors.white,
min: 0.0,
max: scrollController.hasClients
? scrollController
.position.maxScrollExtent
: 10000.0,
value: value,
onChanged: (double value) {
scrollController.position
.jumpTo(value);
if (mounted)
setState(
() => this.value = value);
},
onChangeStart: (double value) {},
onChangeEnd: (double value) {
},
)```
1 ответ
Решение
Вот несколько советов, как сделать это быстрее:
- Вместо того, чтобы использовать
min: 0.0
а такжеmax: 10000.0
вы можете оставить значения по умолчанию для работы с0.0
к1.0
а затем умножьтеvalue * 10000.0
, таким образомSlider
не нужно вычислять позицию для значений из0.0
к10000.0
но из0.0
к1.0
. - Было бы хорошо, если бы
setState()
просто обновляетSlider
а не все дерево виджетов. Для этого вы можете поставитьSlider
вStatefulWidget
, или вы можете обернутьSlider
сStatefulBuilder
. - Запуск приложения в
release
режим будет быстрее, чем вdebug
Режим.
Вот быстрый пример, используя StatefulBuilder
:
StatefulBuilder(
builder: (context, setState) {
return Slider(
value: value,
onChanged: (value) {
_scrollController.position.jumpTo(value * 10000);
setState(() {
this.value = value;
});
},
);
},
)