如果要滑动的项目很多,则滑块会挂起

Slider is hanging if lot of items to slide

我有大约 10000 个项目的水平列表,要滚动我使用的是 flutter 滑块,但它一点也不流畅。我认为在换向阀上设置状态不是正确的方法。

                                            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) {
                                              },
                                            )```

这里有一些提高速度的技巧:

  • 而不是使用 min: 0.0max: 10000.0 你可以离开 从 0.01.0 的默认值,然后乘以 value * 10000.0,这样 Slider 就不用计算了 从 0.010000.0 但从 0.01.0.
  • 如果 setState() 只更新 Slider 就好了 而不是整个小部件树。为此,您可以将 SliderStatefulWidget 中,或者您可以将 Slider 换成 StatefulBuilder.
  • 运行 release 模式下的应用程序将比在 release 模式下更快 debug模式。

这是一个简单的例子,使用 StatefulBuilder:

StatefulBuilder(
  builder: (context, setState) {
    return Slider(
      value: value,
      onChanged: (value) {
        _scrollController.position.jumpTo(value * 10000);
        setState(() {
          this.value = value;
        });
      },
    );
  },
)