gpt4 book ai didi

dart - 不要让 PageView 居中 - Flutter

转载 作者:IT王子 更新时间:2023-10-29 06:46:27 25 4
gpt4 key购买 nike

我目前正在使用 carousel-slider在 Flutter 中获取轮播的库。

此库基于 PageView,在 PageView 中,元素居中。

这就是我得到的旋转木马:

First carousel

这就是我想要的:

Wanted carousel

这是使用 CarouselSlider 的代码:

CarouselSlider(
height: 150,
viewportFraction: 0.5,
initialPage: 0,
enableInfiniteScroll: false,
items: widget.user.lastGamesPlayed.map((game) {
return Builder(
builder: (BuildContext context) {
return Padding(
padding: EdgeInsets.symmetric(horizontal: 10),
child: GestureDetector(
onTap: () {
game.presentGame(context, widget.user);
},
child: ClipRRect(
borderRadius: BorderRadius.all(Radius.circular(25)),
child: Container(
color: Theme.MyColors.lightBlue,
child: Center(
child: Padding(
padding: EdgeInsets.all(20),
child: AutoSizeText(game.name,
style: TextStyle(fontSize: 70),
maxLines: 1)),
),
))));
},
);
}).toList(),
)

下面是 CarouselSlider 库中的代码:

@override
Widget build(BuildContext context) {
return getWrapper(PageView.builder(
physics: widget.isScrollEnabled
? AlwaysScrollableScrollPhysics()
: NeverScrollableScrollPhysics(),
scrollDirection: widget.scrollDirection,
controller: widget.pageController,
reverse: widget.reverse,
itemCount: widget.enableInfiniteScroll ? null : widget.items.length,
onPageChanged: (int index) {
int currentPage =
_getRealIndex(index, widget.realPage, widget.items.length);
if (widget.onPageChanged != null) {
widget.onPageChanged(currentPage);
}
},
itemBuilder: (BuildContext context, int i) {
final int index = _getRealIndex(
i + widget.initialPage, widget.realPage, widget.items.length);

return AnimatedBuilder(
animation: widget.pageController,
child: widget.items[index],
builder: (BuildContext context, child) {
// on the first render, the pageController.page is null,
// this is a dirty hack
if (widget.pageController.position.minScrollExtent == null ||
widget.pageController.position.maxScrollExtent == null) {
Future.delayed(Duration(microseconds: 1), () {
setState(() {});
});
return Container();
}
double value = widget.pageController.page - i;
value = (1 - (value.abs() * 0.3)).clamp(0.0, 1.0);

final double height = widget.height ??
MediaQuery.of(context).size.width * (1 / widget.aspectRatio);
final double distortionValue = widget.enlargeCenterPage
? Curves.easeOut.transform(value)
: 1.0;

if (widget.scrollDirection == Axis.horizontal) {
return Center(
child:
SizedBox(height: distortionValue * height, child: child));
} else {
return Center(
child: SizedBox(
width:
distortionValue * MediaQuery.of(context).size.width,
child: child));
}
},
);
},
));

如何防止元素居中?

提前致谢

最佳答案

如果您不想在滚动时为页面大小设置动画,则无需使用此 carousel-slider 库。

另外,PageView 不是实现您想要的布局的最佳Widget,您应该使用带有 PageScrollPhysics 的水平 ListView

import 'package:flutter/material.dart';

class Carousel extends StatelessWidget {
Carousel({
Key key,
@required this.items,
@required this.builderFunction,
@required this.height,
this.dividerIndent = 10,
}) : super(key: key);

final List<dynamic> items;
final double dividerIndent;

final Function(BuildContext context, dynamic item) builderFunction;

final double height;

@override
Widget build(BuildContext context) {
return Container(
height: height,
child: ListView.separated(
physics: PageScrollPhysics(),
separatorBuilder: (context, index) => Divider(
indent: dividerIndent,
),
scrollDirection: Axis.horizontal,
itemCount: items.length,
itemBuilder: (context, index) {
Widget item = builderFunction(context, items[index]);
if (index == 0) {
return Padding(
child: item,
padding: EdgeInsets.only(left: dividerIndent),
);
} else if (index == items.length - 1) {
return Padding(
child: item,
padding: EdgeInsets.only(right: dividerIndent),
);
}
return item;
}),
);
}
}

用法

           Carousel(
height: 150,
items: widget.user.lastGamesPlayed,
builderFunction: (context, item) {
return ClipRRect(
borderRadius: BorderRadius.all(Radius.circular(25)),
child: Container(
width: 200,
color: Theme.MyColors.lightBlue,
child: Center(
child: Padding(
padding: EdgeInsets.all(20),
child: AutoSizeText(
item.name,
style: TextStyle(fontSize: 70),
maxLines: 1,
),
),
),
),
);
},
)

更新

正如@AdamK 所观察到的,我的解决方案没有与 PageView 相同的滚动物理行为,它更像是水平 ListView

如果您正在寻找这种分页行为,您应该考虑编写自定义 ScrollPhysics 并将其用在您的可滚动小部件上。

This是一篇解释得很好的文章,可以帮助我们达到预期的效果。

关于dart - 不要让 PageView 居中 - Flutter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55699500/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com