Flutter 滚动控制器跳转到指定值不';不工作颤振
在我的应用程序中,我决定显示一个Flutter 滚动控制器跳转到指定值不';不工作颤振,flutter,listview,scrollcontroller,Flutter,Listview,Scrollcontroller,在我的应用程序中,我决定显示一个滚动条,以便在滚动条和列表视图中都需要相同的滚动控制器,我必须将滚动定位列表.builder更改为列表视图.builder。 在我的列表homePageItems中,首先是带有一些“幻灯片”的页面视图(因此在索引0处),然后是解释幻灯片的其他小部件“内容”。在每个幻灯片中都有一个按钮,用于调用controller.jumpTo()转到幻灯片的说明。 当我使用ScrollablePositionedList.builderscrollController.jumpT
滚动条
,以便在滚动条
和列表视图
中都需要相同的滚动控制器
,我必须将滚动定位列表.builder
更改为列表视图.builder
。
在我的列表homePageItems
中,首先是带有一些“幻灯片”的页面视图(因此在索引0处),然后是解释幻灯片的其他小部件“内容”。在每个幻灯片中都有一个按钮,用于调用controller.jumpTo()
转到幻灯片的说明。
当我使用ScrollablePositionedList.builder
scrollController.jumpTo时(索引:5)
按预期工作,跳转到右边的“内容”,但是使用ListView.builder
它没有。它只移动了几个像素,就是这样。。
现在使用ListView.builder
,是否有设置错误或缺少的内容
ListView项目:
List<Widget> homePageItems = [
// carousell index 0
SizedBox(
height: MediaQuery.of(context).size.height > 700 ? MediaQuery.of(context).size.height * 0.89 : MediaQuery.of(context).size.height * 0.85,//580,
width: MediaQuery.of(context).size.width,
child: Stack(
alignment: AlignmentDirectional.center,
children: [
Column(
children: [
Expanded(
child: PageView.builder(
controller: pageController,
onPageChanged: (index) {
timer.cancel();
setState(() {
if (index > _index) {
_current < slides.length -1 ? _current++ : _current = 0;
_index = index;
} else {
_current > 0 ? _current -- : _current = slides.length -1;
_index = index;
}
print('onPageChanged: index is : $index');
print('onPageChanged: _current is : $_current');
});
},
itemBuilder: (context, index){
return slides[_current];
}),
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: slides.map((url) {
int index = slides.indexOf(url);
return Container(
width: 5.0,
height: 5.0,
margin: EdgeInsets.symmetric(vertical: 5.0, horizontal: 2.0),
decoration: BoxDecoration(
shape: BoxShape.circle,
color: _current == index
? Colors.redAccent//Color.fromRGBO(0, 0, 0, 0.9)
: Colors.black54,//Color.fromRGBO(0, 0, 0, 0.4),
),
);
}).toList(),
),
],
),
Row(
children: [
IconButton(
icon: Icon(CupertinoIcons.back,color:Colors.white.withAlpha(170),size: 40,),
onPressed: (){
timer.cancel();
pageController.previousPage(duration: Duration(milliseconds: 800), curve: Curves.fastOutSlowIn);
}),
IconButton(
icon: Icon(CupertinoIcons.forward,color: Colors.white.withAlpha(150),size: 40,),
onPressed: () {
timer.cancel();
pageController.nextPage(duration: Duration(milliseconds: 800), curve: Curves.fastOutSlowIn);
}),
],
mainAxisAlignment: MainAxisAlignment.spaceBetween,
),
],
),
),
// Cloud Biking index 1
SizedBox(
height: MediaQuery.of(context).size.height > 700
? MediaQuery.of(context).size.height * 0.89
: 700,//MediaQuery.of(context).size.height * 0.90,//580,
width: MediaQuery.of(context).size.width,
child: CloudBikingContent(key: widget.key,)
),
// Stolen bicycles index 2
SizedBox(
height: MediaQuery.of(context).size.height > 700
? MediaQuery.of(context).size.height * 0.95
: 800,//MediaQuery.of(context).size.height * 0.90,//580,
width: MediaQuery.of(context).size.width,
child: StolenBicyclesContent(key: widget.key),
),
// Scheduler index 3
SizedBox(
height: MediaQuery.of(context).size.height > 700
? MediaQuery.of(context).size.height * 0.89 // Web
: 870,//MediaQuery.of(context).size.height * 0.90,//580, // Mobile
width: MediaQuery.of(context).size.width,
child: SchedulerContent(key: widget.key,),
),
// Orders index 4
SizedBox(
height: MediaQuery.of(context).size.height > 700
? MediaQuery.of(context).size.height * 0.89
: 850,//MediaQuery.of(context).size.height * 0.90,//580,
width: MediaQuery.of(context).size.width,
child: OrdersContent(key: widget.key,),
),
// Bookings index 5
SizedBox(
height: MediaQuery.of(context).size.height > 700
? MediaQuery.of(context).size.height * 0.89
: 850,//MediaQuery.of(context).size.height * 0.90,//580,
width: MediaQuery.of(context).size.width,
child: BookingsContent(key: widget.key),
),
NavigationBarBottom()
];
List<Widget> slides = [
ScreenTypeLayout(
mobile: CloudBikingSlideMobile(
bgImage: mainBgImageMobile,
onTap: (){
controller.jumpTo(1);
// scrollController.jumpTo(index: 1);
// scrollController.scrollTo(index: 1, duration: Duration(milliseconds: 300), curve: Curves.easeInOut);// .jumpTo(index: 1);
}),
desktop: CloudBikingSlideDesktop(
bgImage: mainBgImageDesktop,
onTap: (){
controller.jumpTo(1);
// scrollController.jumpTo(index: 1);
// scrollController.scrollTo(index: 1, duration: Duration(milliseconds: 300), curve: Curves.easeInOut);//.jumpTo(index: 1);
}),
),
ScreenTypeLayout(
mobile: StolenBicyclesSlideMobile(
bgImage: stolenBicyclesBgMobile,
onTap: (){
controller.jumpTo(2);
// scrollController.jumpTo(index: 2);
// scrollController.scrollTo(index: 2, duration: Duration(milliseconds: 300), curve: Curves.easeInOut);//.jumpTo(index: 2);
}),
desktop: StolenBicyclesSlideDesktop(
bgImage: stolenBicyclesBgDesktop,
onTap: (){
controller.jumpTo(2);
// scrollController.jumpTo(index: 2);
// scrollController.scrollTo(index: 2, duration: Duration(milliseconds: 300), curve: Curves.easeInOut);//.jumpTo(index: 2);
}),
),
ScreenTypeLayout(
mobile: SchedulerSlideMobile(
bgImage: schedulerBgImageMobile,
onTap: (){
controller.jumpTo(3);
// scrollController.jumpTo(index: 3);
// scrollController.scrollTo(index: 3, duration: Duration(milliseconds: 300), curve: Curves.easeInOut);//.jumpTo(index: 3);
}),
desktop: SchedulerSlideDesktop(
bgImage: schedulerBgImageDesktop,
onTap: (){
controller.jumpTo(3);
// scrollController.jumpTo(index: 3);
// scrollController.scrollTo(index: 3, duration: Duration(milliseconds: 300), curve: Curves.easeInOut);//.jumpTo(index: 3);
}),
),
ScreenTypeLayout(
mobile: OrdersSlideMobile(
bgImage: orderBgImageMobile,
onTap: (){
controller.jumpTo(4);
// scrollController.jumpTo(index: 4);
// scrollController.scrollTo(index: 4, duration: Duration(milliseconds: 300), curve: Curves.easeInOut);//.jumpTo(index: 4);
}),
desktop: OrdersSlideDesktop(
bgImage: orderBgImageDesktop,
onTap: (){
controller.jumpTo(4);
// scrollController.jumpTo(index: 4);
// scrollController.scrollTo(index: 4, duration: Duration(milliseconds: 300), curve: Curves.easeInOut);//.jumpTo(index: 4);
}),
),
ScreenTypeLayout(
mobile: BookingsSlideMobile(
bgImage: bookingBgImageMobile,
onTap: (){
controller.jumpTo(5);
// scrollController.jumpTo(index: 5);
// scrollController.scrollTo(index: 5, duration: Duration(milliseconds: 300), curve: Curves.easeInOut);//.jumpTo(index: 5);
}),
desktop: BookingsSlideDesktop(
bgImage: bookingBgImageDesktop,
onTap: (){
controller.jumpTo(5);
// scrollController.jumpTo(index: 5);
// scrollController.scrollTo(index: 5, duration: Duration(milliseconds: 300), curve: Curves.easeInOut);//.jumpTo(index: 5);
}),
),
];
发现了问题
ScrollController
的jumpTo
需要一个像素值,而ItemScrollController
的jumpTo
需要一个索引跳转到并相应移动。。实际上更好的解决方案是。。
因此,通过将内容高度乘以其索引,您可以获得适当的像素偏移量
double contentHeight = MediaQuery.of(context).size.height > 700 ? MediaQuery.of(context).size.height * 0.89 : MediaQuery.of(context).size.height * 0.85;
...
onTap: (){
controller.jumpTo(2 * contentHeight);
// scrollController.jumpTo(index: 2);
// scrollController.scrollTo(index: 2, duration: Duration(milliseconds: 300), curve: Curves.easeInOut);//.jumpTo(index: 2);
}
``
double contentHeight = MediaQuery.of(context).size.height > 700 ? MediaQuery.of(context).size.height * 0.89 : MediaQuery.of(context).size.height * 0.85;
...
onTap: (){
controller.jumpTo(2 * contentHeight);
// scrollController.jumpTo(index: 2);
// scrollController.scrollTo(index: 2, duration: Duration(milliseconds: 300), curve: Curves.easeInOut);//.jumpTo(index: 2);
}
``