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有a、B和C页面视图和我的幻灯片a,那么B和C幻灯片也会出现。。。如果我滑动B,那么A和C滑动。。。等等。您可以参考诀窍是使用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并比较它们的值