Flutter 颤振-如何同步两个或多个页面控制器

Flutter 颤振-如何同步两个或多个页面控制器,flutter,Flutter,在flatter中,我无法将相同的PageController分配给许多PageView。因此需要使用两个或更多的PageControllers 我需要同步我的查看页面s,这样当我彼此滑动时,它也会滑动 如何同步两个或多个PageController或PageView? 我想要的是每个PageView都可以控制其他PageView使它们无论在哪个幻灯片上都同步 因此,如果a有a、B和C页面视图和我的幻灯片a,那么B和C幻灯片也会出现。。。如果我滑动B,那么A和C滑动。。。等等。您可以参考 诀窍是

flatter
中,我无法将相同的
PageController
分配给许多
PageView
。因此需要使用两个或更多的
PageController
s

我需要同步我的
查看页面
s,这样当我彼此滑动时,它也会滑动

如何同步两个或多个
PageController
PageView

我想要的是每个
PageView
都可以控制其他
PageView
使它们无论在哪个幻灯片上都同步

因此,如果a有aBC页面视图和我的幻灯片a,那么BC幻灯片也会出现。。。如果我滑动B,那么AC滑动。。。等等。

您可以参考
诀窍是使用NotificationListener来侦听ScrollUpdateNotification
然后比较两页

_backgroundPageController.page != _pageController.page
第183行的代码段

new NotificationListener<ScrollNotification>(
          onNotification: (ScrollNotification notification) {
            if (notification.depth == 0 &&
                notification is ScrollUpdateNotification) {
              selectedIndex.value = _pageController.page;
              if (_backgroundPageController.page != _pageController.page) {
                _backgroundPageController.position
                    // ignore: deprecated_member_use
                    .jumpToWithoutSettling(_pageController.position.pixels /
                    _kViewportFraction);
              }
              setState(() {});
            }
            return false;
          }
新建NotificationListener(
onNotification:(滚动通知){
如果(notification.depth==0&&
通知为ScrollUpdateNotification(更新通知){
选择dex.value=\u pageController.page;
如果(\u backgroundPageController.page!=\u pageController.page){
_背景页面控制器位置
//忽略:不推荐的\u成员\u使用
.跳转到无设置(_pageController.position.pixels/
_kVIEWPORT分数);
}
setState((){});
}
返回false;
}
完整代码


还有另一种解决方案。当您创建控制器时,可以为每个控制器添加侦听器。在每个侦听器中,您应该描述另一个控制器的逻辑

为了更清楚,我将更详细地描述。如果有必要,您可以将逻辑组合到一个方法中,但它将不太清楚

 int _previousPage = 0;
  bool _isController1 = false;
  bool _isController2 = false;

  void resetMoveInfo(){
      _isController1 = false;
      _isController2 = false;
  }

     void _onController1Scroll() {
        if (_isController2)
          return;

        _isController1 = true;
        if (_controller1.page.toInt() == _controller1.page) {
          _previousPage = _controller1.page.toInt();
          resetMoveInfo();
        }

        _controller2.position
            // ignore: deprecated_member_use
            .jumpToWithoutSettling(_controller1.position.pixels * _viewPortFraction);
      }

void _onController2Scroll() {
        if (_isController1)
          return;

        _isController2 = true;
        if (_controller2.page.toInt() == _controller2.page) {
          _previousPage = _controller2.page.toInt();
          resetMoveInfo();
        }

        _controller1.position
            // ignore: deprecated_member_use
            .jumpToWithoutSettling(_controller2.position.pixels / _viewPortFraction);
      }
初始化控制器时,应该为每个控制器添加侦听器

  _controller1 = PageController(
      initialPage: _previousPage,
      keepPage: false,
      viewportFraction: 1)
    ..addListener(_onController1Scroll);
同步两个页面视图(例如,如果要使用不同的ViewFraction) 创建两个控制器,上视图分数为0.7,下视图分数为1.0 现在要同步,请将侦听器添加到upper并获取当前滚动偏移值

   @override
  void initState() {
    super.initState();
       _controller_upper = new PageController(viewportFraction: 0.7);
    _controller_bottom = new PageController();
    _controller.addListener(_onScroll);
  }

  void _onScroll() {
    scrollValue = _controller.page;
    //page returns value between 0 to 1 for 1st page, 1 to 2 for second and s on, need to multiply it by screen width
    _controller_bottom.jumpTo(scrollValue*MediaQuery.of(context).size.width);
  }

在这种情况下,只有一个页面视图可以控制其他页面。我想要的是,每个页面视图都可以控制其他页面视图,使它们无论哪张幻灯片都同步。在这种情况下,NotificationListener侦听所有滚动更新页面视图的信息,甚至选项卡栏,这样您就可以保留所有pageController.page并比较它们的值