七爪源码在Flutter中使用PageViewBuilder构建折叠滚动
在本文中,我们将创建一个类似于 LOUIS VUITTON 移动应用程序的列表视图的水平滚动。
最终应用程序的工作原理如下:
在深入研究编码之前,让我们讨论将在此应用程序中使用的小部件。
页面预览
PageView 是一个小部件,它生成可滚动的屏幕页面。 这些页面可以是由构建器功能构建的固定页面或重复页面。
PageView 在构造元素时的行为类似于 ListView。 PageView 还允许用户在 Flutter 应用程序中的不同屏幕之间切换。
PageView 类的构造函数PageView({Key key, Axis scrollDirection, bool reverse, PageController controller, ScrollPhysics physics, bool pageSnapping, void Function(int) onPageChanged, List children, DragStartBehavior dragStartBehavior, bool allowImplicitScrolling})
PageView 小部件的属性: scrollDirection:它定义页面在哪个轴上滚动,即垂直或水平 reverse:定义滚动方向。默认设置为 false。 控制器:它允许我们操作在 PageView 中可见的页面。 物理:它定义了当页面无法拖动时页面在页面端点处的动画效果。 pageSnapping:对于自定义滚动行为很有用。它采用布尔值。 onPageChanged:页面有变化时触发的函数。 children:它包含小部件列表。 dragStartBehaviour:此属性将 DragStartBehavior 枚举(最终)保存为对象。它控制开始注册拖动行为的方式。 allowImplicitScrolling:此属性接受一个布尔值作为对象。它控制是否将隐式滚动分配给小部件的页面。
PageView.builder
PageView.builder 创建一个可滚动列表,该列表使用按需创建的小部件逐页工作。
此构造函数适用于具有大量(或无限)子级的页面视图,因为仅对那些实际可见的子级调用构建器。
提供非空 itemCount 让 PageView 计算最大滚动范围。
PageView.builder 小部件的属性
它拥有 PageView 的所有属性,并拥有一些自己的属性。 itemBuilder:只有索引大于或等于零且小于 itemcount 时才会调用它。 restoralionID:restoreidID 以字符串为对象。它用于保存滚动位置并在以后恢复它。 clipBehaviour:内容将根据此选项进行剪辑(或不剪辑)。 padEnds:是否在列表的两端添加填充。
堆
Stack 是 Fl utter SDK 的内置小部件,允许用户将小部件保持在彼此之上,从而形成小部件层。第一个小部件是最底部的项目,最后一个小部件是最顶部的项目。
Stack 小部件的一些关键点是:堆栈中的孩子可以定位或不定位。定位子项是那些包装在具有至少一个非空属性的定位小部件中的子项。堆栈自己调整大小以包含所有未定位的子项,这些子项根据对齐方式进行定位(在从左到右的环境中默认为左上角,在从右到左的环境中默认为右上角)。然后根据它们的 top、right、bottom 和 left 属性相对于堆栈放置定位的子项。对齐属性可用于更改小部件的对齐方式。
让我们深入了解
首先,我们创建将在我们的应用程序中使用的数据。
在 lib 文件夹中创建 dummy_data.dart。在这里,我们放置项目数组。
dummy_data.dart:var model = [ "https://images-static.nykaa.com/uploads/f5a1d948-7947-4241-a08e-caac8d991c48.jpg?tr=w-300,cm-pad_resize", "https://images-static.nykaa.com/uploads/c622c7aa-7cdb-43ba-98b7-acb48df7f7c5.jpg?tr=w-300,cm-pad_resize", "https://images-static.nykaa.com/uploads/fea188e3-9067-4c1f-a3a3-07560f60d73d.jpg?tr=w-300,cm-pad_resize", "https://images-static.nykaa.com/uploads/2f2275d3-0b85-4189-8fb3-7318ca1c3bec.jpg?tr=w-300,cm-pad_resize", "https://images-static.nykaa.com/uploads/9a4d3606-9aeb-4285-8db1-4918428a1c76.jpg?tr=w-300,cm-pad_resize", "https://images-static.nykaa.com/uploads/455bf3cd-82d4-4b2c-ab5d-e56491edc0f1.jpg?tr=w-300,cm-pad_resize", ];
数据已准备就绪,现在让我们创建将成为网页浏览项目的小部件。 在 lib 文件夹中创建 page_view_item.dart。
page_view_item.dartimport "package:flutter/material.dart"; class PageViewItem extends StatelessWidget { final int index; final String url; final double width; static const String name=""; static const String price=""; const PageViewItem({ Key? key, required this.index, required this.width, required this.url, }) : super(key: key); @override Widget build(BuildContext context) { return InkWell( onTap: () => print(index), child: Card( elevation: 5, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(1.0), ), child: Image.network( url, fit: BoxFit.cover, width: width, ), ), ); } }
接下来我们创建 homepage.dart 文件:
首先,我们配置页面视图并创建提供 viewportFraction 的 PageController。final _controller = PageController( viewportFraction: 0.5, );
视口分数
它定义了每个页面应该占据的视口部分。 默认为 1.0,这意味着每个页面在滚动方向上填充视口。
当我们的控制器被设置后,我们会计算页面浏览量的单个项目的宽度。late final _itemWidth =MediaQuery.of(context).size.width * _controller.viewportFraction;
然后我们在 initState 中初始化控制器。@override void initState() { super.initState(); _controller.addListener(() => setState(() { _page = _controller.page!; })); }
这就是我们的 homepage.dart 文件的外观。
homepage.dart: import "package:flutter/src/foundation/key.dart"; import "package:flutter/src/widgets/framework.dart"; import "package:flutter/material.dart"; import "dummy_data.dart"; import "page_view_item.dart"; class HomePage extends StatefulWidget { const HomePage({Key? key}) : super(key: key); @override State createState() => _HomePageState(); } class _HomePageState extends State { /// The current page of the page view double _page = 0; /// The index of the leftmost element of the list to be displayed int get _firstItemIndex => _page.toInt(); /// Controller to get the current position of the page view final _controller = PageController( viewportFraction: 0.5, ); /// The width of a single item late final _itemWidth = MediaQuery.of(context).size.width * _controller.viewportFraction; @override void initState() { super.initState(); _controller.addListener(() => setState(() { _page = _controller.page!; })); } @override void dispose() { super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text("LV Scroll"), ), body: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Stack( children: [ Positioned.fill( child: Align( alignment: Alignment.centerLeft, child: SizedBox( width: _itemWidth, child: FractionallySizedBox( child: PageViewItem( index: _firstItemIndex, width: _itemWidth, url: model[_firstItemIndex], ), ), ), ), ), SizedBox( height: 250, child: PageView.builder( padEnds: false, controller: _controller, itemBuilder: (context, index) { return Opacity( opacity: index <= _firstItemIndex ? 0 : 1, child: PageViewItem( index: index, width: _itemWidth, url: model[index], ), ); }, itemCount: model.length, ), ), ], ), ], ), ); } }
结论
我希望这篇文章对你有所帮助,并且你学到了新的东西。 我在这篇文章中使用了各种对你们中的一些人来说可能是新的东西。
公鸡为什么比母鸡漂亮?耿耿于怀六十年,百思不得其解,不吐不快这是一个真实的故事。5岁那年,妈妈带我去幼儿园入园考试。开始,老师拿着好多的图片,问了好多问题,反正我尽力一一作了回答。后来,老师放下了图片,问我公鸡生蛋还是母鸡生蛋?那个年代,没
阆中熊猫乐园里面没有熊猫,外地游客购票后大骂骗子日前,一则外地女游客在阆中熊猫乐园售票处大骂骗子,退钱的视频,引发了不少网友的关注。通过视频简介可以得知,该外地游客买票后,才得知熊猫乐园已经没有熊猫了,感觉自己受了骗,继而大闹售
文体旅游年味浓2月9日,重庆市酉阳土家族苗族自治县菖蒲高山生态旅游度假区出现雪凇云海美景。雪后初霁,银装素裹,玉树琼枝,美不胜收。邱洪斌摄(中经视觉)2月9日,游客在北京前门大街北口的冬奥主题花
世业洲开心休博园春节假期共接待游客2万人次春节假期,世业洲开心休博园共接待游客2万人次,该园精心策划的传统文化活动受游客喜爱。2月6日,小编在开心休博园看到,极具民俗文化特色的舞狮节目正在上演,表演者通过不同的马步,配合狮
你厨房里珍藏的油,危险可能比你想象的大花生油富含丰富的维生素E,具有明显的抗氧化抗衰老功能,同时在预防心脑血管疾病,润燥滑肠方面表现优异,受到很多家庭的喜爱。但花生在存储运输的过程中同意产生黄曲霉毒素,黄曲霉毒素是迄今
晨起第一杯水这样喝,养生水变伤命水一代文学奇才曹雪芹说过女人是水做的。其实,人都是水做的。生命的起源孕育和维持,都离不开水。如果没有水,人体就无法维持血液循环呼吸消化排泄体温恒定等生理活动。图源网络当然,只知道要喝
久泄肝气乘脾的舌象肝气乘脾舌边红主症泄泻,胃脘胀痛,急躁易怒舌尖为心肺所属,舌尖红为郁火则胸闷憋气,夜眠不实舌尖中部凹陷多为慢性咽炎舌中部为脾胃,凹陷则虚则胃胀消化不良舌边暗红为肝郁火旺急躁易怒舌根
一杯养生茶三个养生穴远离节后综合征节日过后,你是否感觉迟迟进入不了工作状态?会否容易疲劳乏力失眠多梦?是否出现腹胀胃口不佳的症状?专家表示,经历作息紊乱饮食不节的假期后,刚回到工作岗位上,不少人会出现这类节后综合征
33岁阿黛尔斩获三项大奖!穿迷你小黑裙没有腰,脸上皱纹太明显了当地时间2月8日,阿黛尔参加了全英音乐奖的颁奖典礼,一举斩获三项大奖的阿黛尔成为了有史以来的第一位无性别的年度艺人,她绝对算是当晚的最大赢家。阿黛尔在颁奖典礼上连换两套造型,都以裙
轰2735!小波特天神下凡,英格拉姆肃然起敬,火箭他价值6000万在今天结束的一场比赛中,鹈鹕11097击败火箭。本场比赛埃里克戈登仍然无法出战,火箭对于他应该是保护起来了。就看对戈登有意的球队给出什么的筹码,毕竟交易截止日11号凌晨就截止了。现
冬奥会上的内蒙古身影草原因你而骄傲图为赵丹。呼和浩特市政府供图(北京冬奥会)综述冬奥会上的内蒙古身影草原因你而骄傲中新网呼和浩特2月9日电题冬奥会上的内蒙古身影草原因你而骄傲中新网记者李爱平赵丹丁雨欢来自内蒙古大草