Scroll 如何在颤振中滚动或跳转到PageView.builder或PageController的位置?

Scroll 如何在颤振中滚动或跳转到PageView.builder或PageController的位置?,scroll,flutter,position,flutter-layout,pageviews,Scroll,Flutter,Position,Flutter Layout,Pageviews,问题:使用PageController加载页面视图后无法滚动到位置* 像ViewPager一样,在Android中滚动到特定页面 Widget\u buildCarousel(BuildContext上下文,int-selectedIndex){ PageController=PageController(viewportFraction:1,keepPage:true); 返回列( mainAxisSize:mainAxisSize.min, 儿童:[ 大小盒子( //您可能希望在此处使用纵横

问题:使用PageController加载页面视图后无法滚动到位置*

像ViewPager一样,在Android中滚动到特定页面

Widget\u buildCarousel(BuildContext上下文,int-selectedIndex){
PageController=PageController(viewportFraction:1,keepPage:true);
返回列(
mainAxisSize:mainAxisSize.min,
儿童:[
大小盒子(
//您可能希望在此处使用纵横比来支持平板电脑
高度:400.0,
宽度:240,
子项:PageView.builder(
itemCount:assetImageList.length,
控制器:控制器,
itemBuilder:(BuildContext上下文,int itemIndex){
返回_buildCarouselItem(上下文、selectedIndex、itemIndex);
},
),
)
],
);
}
您可以使用jumpTo()方法滚动页面视图的位置。 我在下面的示例中创建了一个changepageviewposition()方法:

import 'package:flutter/material.dart';

class MyPageView extends StatefulWidget {
  createState() {
    return StateKeeper();
  }
}

class StateKeeper extends State<MyPageView> {

  PageController controller = PageController(viewportFraction: 1, keepPage: true);
  var currentPageValue = 0.0;
  var mItemCount = 10;

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    controller.addListener(() {
      setState(() {
        currentPageValue = controller.page;
      });
    });
  }

  void changePageViewPostion(int whichPage) {
    if(controller != null){
      whichPage = whichPage + 1; // because position will start from 0
      double jumpPosition = MediaQuery.of(context).size.width / 2;
      double orgPosition = MediaQuery.of(context).size.width / 2;
      for(int i=0; i<mItemCount; i++){
        controller.jumpTo(jumpPosition);
        if(i==whichPage){
          break;
        }
        jumpPosition = jumpPosition + orgPosition;
      }
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('PageView position change'),
      ),
      body: PageView.builder(
        controller: controller,
        itemBuilder: (context, position) {
          return Container(
            color: position % 2 == 0 ? Colors.blue : Colors.pink,
            child: Column(
              children: <Widget>[

                Center(
                  child: Text(
                    "Page " + (position + 1).toString(),
                    style: TextStyle(color: Colors.white, fontSize: 22.0),
                  ),
                ),

                Align(
                  alignment: FractionalOffset.bottomCenter,
                  child: Padding(padding: EdgeInsets.only(bottom: 20),
                    child: FloatingActionButton(
                        elevation: 0.0,
                        child: new Icon(Icons.check),
                        backgroundColor: new Color(0xFFE57373),
                        onPressed: (){
                          changePageViewPostion(5);
                        }
                    ),),
                ),

              ],
            ),
          );
        },
        itemCount: mItemCount,
      )
    );
  }


}

希望有帮助:)

终于找到了答案。只需将初始页面:mSelectedPosition属性设置为:

child: PageView.builder(
        itemCount: mTemplateModelList.length,
        controller: PageController(initialPage: mSelectedPosition, keepPage: true, viewportFraction: 1),
        itemBuilder: (BuildContext context, int itemIndex) {
          return _buildCarouselItem(context, selectedIndex, itemIndex);
        },
      ),

或者,如果您想在单击按钮后滚动页面,您可以使用另一个用户在下面清楚地提到的PageController使用jumpTo()方法:@android。

目前有两个选项来处理您的请求:

PageView.builder(
  controller: _pageController,
  itemCount: _list.length,
  itemBuilder: (context, index) {
    return GestureDetector(
      onTap: () {
        _pageController.jumpToPage(index); // for regular jump
        _pageController.animateToPage(_position, curve: Curves.decelerate, duration: Duration(milliseconds: 300)); // for animated jump. Requires a curve and a duration
      },
      child: Container();
    );
  }
),

我需要这个尽快的用户查看该页面。当用户点击按钮时,则不会。所以你能帮我吗?意思是当用户查看那个页面或滚动那个页面时,你需要像第一页或第二页一样的滚动位置。对吧?你说的没错。如果我们能听到页面的变化,我们就能做到这一点。那么,有PageChangeListener吗?当然有。非常感谢。我刚刚找到并发布了上面的答案。谢谢你的帮助_定位我们如何获得该值??这将是您希望从一个索引移动到另一个索引的变量
child: PageView.builder(
        itemCount: mTemplateModelList.length,
        controller: PageController(initialPage: mSelectedPosition, keepPage: true, viewportFraction: 1),
        itemBuilder: (BuildContext context, int itemIndex) {
          return _buildCarouselItem(context, selectedIndex, itemIndex);
        },
      ),
PageView.builder(
  controller: _pageController,
  itemCount: _list.length,
  itemBuilder: (context, index) {
    return GestureDetector(
      onTap: () {
        _pageController.jumpToPage(index); // for regular jump
        _pageController.animateToPage(_position, curve: Curves.decelerate, duration: Duration(milliseconds: 300)); // for animated jump. Requires a curve and a duration
      },
      child: Container();
    );
  }
),