颤动 scollable.ensurevisible 不能反向工作

flutter scollable.ensurevisible not working in reverse direction

请查看视频/gif:

我的综合浏览量将使当前选项卡处于活动状态。我需要确保活动选项卡始终可见,即使用户多次滑动屏幕也是如此。它是从左到右工作的。但是当我们尝试从右向左返回时,它的行为并不像预期的那样。

页面视图文件

         PageView(
            controller: pageController,
            onPageChanged: (int page) {
              _duaWidgetState.currentState.updateBtn(page + 1);
              Scrollable.ensureVisible(
                  _duaWidgetState.currentState.activeBtn.currentContext);
            },
            children: loaded

带滚动视图文件的 TabBarWidget

    GlobalKey activeBtn = GlobalKey();
      var _selectedTab = 1;
      @override
      Widget build(BuildContext context) {
        return Container(
          padding: EdgeInsets.symmetric(vertical: 20),
          child: SingleChildScrollView(
            scrollDirection: Axis.horizontal,
            child: Row(
              children: List.generate(widget.numberOfTab,
                  (index) => tabBarItem(index + 1, widget.numberOfTab, activeBtn)),
            ),
          ),
        );
      }

使用密钥的容器

               Container(
                  key: activeBtn,
                  margin: EdgeInsets.only(left: 20),
                  padding: EdgeInsets.symmetric(
                    vertical: 10,
                    horizontal: 24,
                  ),

没有人回答我的问题。但是,经过大量的努力和时间。我找到了解决此问题的解决方法。希望这是一个 bug,flutter 团队会在接下来的更新中修复它。

Scrollable.ensureVisible(_duaWidgetState.currentState.activeBtn.currentContext); 

此函数有一个称为对齐的可选参数,可以对其进行调整以确保所选 element/button 位于视口的中心。 (在我的例子中水平居中)。

我的小部件是水平滚动的,所以我需要根据PageView()的结果更新页码,这里我使用

alignment: 0

从左向右轻扫页面视图,它工作正常。但是,当我从右向左滑动页面以转到 PageView 小部件中的上一页时,使用这种对齐方式,ensureVisible 无法按预期工作。所选 element/button 不在视图中。我试验了一下,发现当我使用

aligment: 1

ensureVisible 在从右向左滑动但同时工作正常。当我从左向右滚动时,同样的问题发生了。

最后,我设法采取了一些解决方法来解决此问题。解决方案是将最后一页索引存储在一个变量中,并检查最后一页是否大于新页面然后 alignment: 0 如果最后一页小于新页面 aligment:1 就像这样。

   PageView(
    onPageChanged: (int page) {
    if (lastPage < page) {
    Scrollable.ensureVisible(
    _duaWidgetState.currentState.activeBtn.currentContext,
     
     alignment: -0.0100,
     );
     } else {
     Scrollable.ensureVisible(
        _duaWidgetState.currentState.activeBtn.currentContext,
                        (Perfect For font size 24)
     alignment: 1.005,
                    );
                  }}

希望我的回答对以后的人有所帮助。