Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart PageView:禁用默认滚动并将其替换为点击事件_Dart_Flutter - Fatal编程技术网

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
);