Dart PageView:禁用默认滚动并将其替换为点击事件
如果我有一个Dart PageView:禁用默认滚动并将其替换为点击事件,dart,flutter,Dart,Flutter,如果我有一个页面视图,我如何禁用默认的滚动行为(滑动),并通过点击按钮将下一个项目滚动到视图中?因此我尝试如下解决方案,如果有人有更好的解决方案,请与我们分享 在页面视图中按一个按钮转到下一个项目: 将PageController添加到PageView,并使用animateTo或jumpTo方法在用户按下按钮时转到所需项目。我将当前视图的整个宽度设置为偏移量,以便成功地过渡到下一个项目 onPressed: () { c.animateTo(MediaQuery
页面视图
,我如何禁用默认的滚动行为(滑动),并通过点击按钮将下一个项目滚动到视图中?因此我尝试如下解决方案,如果有人有更好的解决方案,请与我们分享
在页面视图中按一个按钮转到下一个项目
:
将PageController
添加到PageView
,并使用animateTo
或jumpTo
方法在用户按下按钮时转到所需项目。我将当前视图的整个宽度设置为偏移量,以便成功地过渡到下一个项目
onPressed: () {
c.animateTo(MediaQuery
.of(context)
.size
.width, duration: new Duration(seconds: 1),
curve: Curves.easeIn);
}
禁用默认的刷卡行为:
我所做的只是将我的PageView
包装在IgnorePointer
中,忽略任何用户交互,我真的不喜欢这个解决方案,在这个示例中它可能工作得很好,但是,在其他情况下,我可能希望用户与当前显示页面中的单个小部件交互
这是我的示例代码:
class FirstPage扩展StatefulWidget{
@凌驾
_FirstPageState createState()=>新建_FirstPageState();
}
类_FirstPageState扩展了状态{
滚动控制器c;
@凌驾
void initState(){
super.initState();
c=新的页面控制器();
}
@凌驾
小部件构建(构建上下文){
归还新脚手架(
浮动操作按钮:新行(
mainAxisAlignment:mainAxisAlignment.end,
crossAxisAlignment:crossAxisAlignment.end,
儿童:[
新浮动操作按钮(
子项:新图标(图标。在之前导航),按下:(){
//c、 animateTo(MediaQuery.of(context).size.width,duration:new duration(秒:1),curve:Curves.easeIn);
c、 跳到(0.0);
}),
新货柜(宽度:15.0,),
新浮动操作按钮(
子项:新图标(图标。导航到下一步),按下:(){
c、 animateTo(MediaQuery)
.of(上下文)
.尺寸
.宽度、持续时间:新的持续时间(秒数:1),
曲线:Curves.easeIn);
}),
],),
appBar:new appBar(标题:新文本(“第一页”),
正文:新建IgnorePointer(子项:新建页面视图(
控制员:c,,
儿童:[
新专栏(
子项:[新容器(子项:新文本(“第一项”))
]),
新容器(子项:新文本(“第二项”),
],
),),
);
}
}
欢迎对此解决方案提出任何建议或修改。要禁用刷卡,您可以设置:
PageView(physics:new NeverScrollableScrollPhysics())
可能对某些人有所帮助的附加说明 如果您在其中一个页面中有一个动态谷歌地图停止了对手势的反应,那么使用PageView(physics:new NeverScrollableScrollPhysics())非常有用。页面视图似乎优先于地图 添加NeverScrollablePhysics()可使地图再次对手势做出反应
谢谢停止滚动的最佳方法是更改页面视图的物理参数 如果页面视图处于开始或结束位置,则停止滚动边缘使用
physics: ClampingScrollPhysics()
要完全停止滚动,请使用
physics: NeverScrollableScrollPhysics()
要禁用手势刷卡,请将以下属性添加到页面视图:
PageView(physics:new NeverScrollableScrollPhysics())
要在PageView中导航到下一页/小部件,请将以下代码添加到按钮的onPressed属性:
_pageController.nextPage(
duration: Duration(milliseconds: 1000),
curve: Curves.easeIn
);
是否可以在页面视图中检测向前和向后滑动事件?使用listener?@ShyjuMadathil和
PageViewController
可以添加事件更改时触发的侦听器。但是,PageView.builder()
为您提供了onPageChanged
属性,当页面向前或向后更改时会触发该属性,我相信这正是您需要的。我刚才尝试过。我能够以这种方式在多个页面上运行MediaQuery.of(context).size.width*(pageIndex+1)
。几乎我有70多个页面。不可能通过这种方法在页面视图中使用文本字段。这会不会禁用使用页面控制器滚动的功能?
?如果我想禁用滑动,并在按下按钮时滑动到下一个页面,该怎么办?只需回答@SakchhamSharma的问题:这只会禁用滑动,您仍然可以设置动画以显示其他页面通过控制器编程,对于instace\u controller.nextPage()
Hi@JannieTheunissen,我指的是滚动。您可以更改页面,是的;但是,由于基础的NeverScrollableScrollPhysics
,动画受到限制。
_pageController.nextPage(
duration: Duration(milliseconds: 1000),
curve: Curves.easeIn
);