【问题标题】:Flutter - update CustomScrollView's scroll controllerFlutter - 更新 CustomScrollView 滚动控制器
【发布时间】:2021-11-15 23:41:02
【问题描述】:

我想在收到来自 bloc 的新状态后更新 _scrollController 的初始偏移量。基本上,这是一个必须适应来自玩家的新时间的时间线。

这就是我在有状态小部件中所做的事情

   void initState() {
     _scrollController =
         ScrollController(initialScrollOffset: 100); //
     super.initState();   }

这是自定义滚动视图

 BlocBuilder<Timer, TimestampState>(builder: (context, state) {

      calculatedScrollOffset = state.time.pixels;
      _scrollController = ScrollController(initialScrollOffset: calculatedScrollOffset);

        return CustomScrollView(
          controller:  _scrollController,
          reverse: false,
          scrollDirection: Axis.horizontal,
          slivers: timeLinePieces,
        ),
      );

不幸的是,没有公共二传手可以做类似_scrollController.offset= 200 的事情。当我调试此代码时,调试中有详细信息,但是一旦新状态来自 bloc,我就会看到 ScrollController 的“无客户端”。 实现这一目标的最佳方法是什么?每次收到新的TimestampState 时,我都尝试渲染新的时间线小部件,但这也没有任何效果。理想情况下,我想使用 setState 为偏移量绑定一个新值并再次渲染小部件以查看效果。

【问题讨论】:

  • 你需要使用 _scrollController.jumpTo() 或 .animateTo() 在 build 中调用 ScrollController 的构造函数。
  • 这正是我想要实现的。谢谢! if (_scrollController.hasClients) { Future.delayed(Duration(milliseconds: 1), () { _scrollController.jumpTo(_scrollController.position.pixels + 0.1); }); }
  • 很高兴能帮上忙。但考虑在 postFrameCallback 中调用 .jumpTo。它用于注册构建后要执行的回调方法。我会在答案中告诉你。

标签: flutter


【解决方案1】:

这应该可行:

    BlocBuilder<Timer, TimestampState>(builder: (context, state) {
    
          calculatedScrollOffset = state.time.pixels;
          WidgetsBinding.instance.addPostFrameCallback((_) =>_scrollController.jumpTo(_scrollController.position.pixels + 0.1));
            return CustomScrollView(
              controller:  _scrollController,
              reverse: false,
              scrollDirection: Axis.horizontal,
              slivers: timeLinePieces,
            ),
          );

.postFrameCallback 用于注册构建函数完成后要执行的方法。依赖 Duration(毫秒: 1) 是不安全的。

【讨论】:

  • 我真的很喜欢这个带有 postFrameCallback 的解决方案。谢谢!现在我面临这个滚动小部件的问题,它也正在从块和用户的触摸中更新。用户的拖动事件被来自 bloc 的新状态中断。
猜你喜欢
  • 2022-12-28
  • 2021-08-24
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 2020-11-27
  • 2021-08-17
  • 2021-08-19
  • 2019-11-20
相关资源
最近更新 更多