【问题标题】:Flutter: ListView not scrollingFlutter:ListView不滚动
【发布时间】:2020-02-11 06:13:48
【问题描述】:

问题:

最初我禁用了ListView 滚动,并希望在 3 秒后启用它。当应用程序启动并且您继续滚动它大约 5 秒钟(手指不离开屏幕)时,ListView 不会滚动。

但是它应该滚动,因为我在第 3 秒启用滚动,控制台确认 ListView enabled 但我仍然无法滚动它。

代码:

bool _enabled = false; // scrolling disabled initially

@override
void initState() {
  super.initState();
  Timer(Duration(seconds: 3), () {
    print("Scrolling enabled");
    setState(() => _enabled = true); // scrolling enabled after 3 seconds
  });
}

@override
Widget build(BuildContext context) {
  return Scaffold(
    body: ListView.builder(
      physics: _enabled ? ClampingScrollPhysics() : NeverScrollableScrollPhysics(),
      itemBuilder: (_, i) => ListTile(title: Text("Item $i")),
    ),
  );
}

【问题讨论】:

  • 我检查你的代码它一直在滚动。
  • 我的手机无论是否抬起手指都可以正常工作。我没有遇到 5 秒停止或任何滚动问题。
  • @HussnainHaidar 感谢您的评论,实际上您需要做的就是在应用程序启动的那一刻开始滚动(在接下来的 10 秒内不要将手指从屏幕上移开一次),您会看到ListView 没有滚动。
  • listview 构造函数中还有一个名为 primary 的参数,尝试启用禁用该参数。
  • 还有两个小部件 ignorePointer 和吸收指针尝试将您的列表视图包装在其中一个小部件中。

标签: flutter dart flutter-layout


【解决方案1】:

这里有一个解决方法:

final _scrollController = ScrollController();
var _firstScroll = true;
bool _enabled = false;

@override
void initState() {
  super.initState();
  Timer(Duration(seconds: 3), () {
    setState(() => _enabled = true);
  });
}

@override
Widget build(BuildContext context) {
  return Scaffold(
    body: GestureDetector(
      onVerticalDragUpdate: (details) {
        if (_enabled && _firstScroll) {
          _scrollController
              .jumpTo(_scrollController.position.pixels - details.delta.dy);
        }
      },
      onVerticalDragEnd: (_) {
        if (_enabled) _firstScroll = false;
      },
      child: AbsorbPointer(
        absorbing: !_enabled,
        child: ListView.builder(
          controller: _scrollController,
          physics: ClampingScrollPhysics(),
          itemBuilder: (_, i) => ListTile(title: Text("Item $i")),
        ),
      ),
    ),
  );
}

【讨论】:

  • 抱歉,这没有回答问题。
  • 为什么不呢?它使 ListView 在前 3 秒内不滚动,如果您在没有将手指从屏幕上移开的情况下滚动,则它会在 3 秒后开始滚动
  • 我忘了输入你的 initState(),但它应该可以工作。
  • 好的,我运行了你的完整代码,但没有包含我的initState,我会包含它并稍后试一试,然后告诉你。
  • 它成功了,我发誓我想奖励你赏金,但很快它被奖励给了不同的用户,让我标记这篇文章,希望版主可以奖励给你。
【解决方案2】:

试试这个...

class _blabla extends State<blabla> {
Timer _timer;
}

@override
void initState() {
  super.initState();
    bool _enabled = false;
);
}

  _blablaState() {
    _timer = new Timer(const Duration(seconds: 3), () {
      setState(() => _enabled = true);
      });
    });
  }

@override
Widget build(BuildContext context) {
  return Scaffold(
    body: ListView.builder(
      physics: _enabled ? ClampingScrollPhysics() : NeverScrollableScrollPhysics(),
      itemBuilder: (_, i) => ListTile(title: Text("Item $i")),
    ),
  );
}

@override
void dispose() {
    super.dispose();
    _timer.cancel();
}

我也会尝试禁用物理功能,看看它是否有所作为。可能存在冲突。

【讨论】:

  • 您好,在将其作为答案之前您自己尝试过吗?
  • 我的答案是针对您帖子中提到的计时器。手势检测器和吸收指针是您原始帖子中未使用的小部件,并且是一个很好的解决方法,无需使用计时器。
猜你喜欢
  • 2020-09-24
  • 2020-05-23
  • 2018-11-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-03
  • 2021-04-05
  • 2020-06-08
  • 2023-03-27
相关资源
最近更新 更多