Ползунок висит, если сдвигается много предметов

У меня есть горизонтальный список из 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;
        });
      },
    );
  },
)
Другие вопросы по тегам