Flutter-仿携程首页类型切换

效果

唠叨

闲来无事,不小心下载了携程app,还幻想可以去旅游一番,奈何自己运气不好,自从高考时第一次吹空调导致自己拉肚子考试,物理,数学考了一半就交卷,英语2B铅笔除了问题,导致原来120多分变成50分,本来能上一本的我只能上个大专,家里没钱也不允许留级,只能去了最近比较火的宿迁学院,哈哈,只能自己在这里瞎写找理由了,哎,现在因为当初的运气不好导致现在专科找工作难的要死,虽然自考了本,奈何人家不要啊,不承认啊,简历只要被学习的本科前面加上自考2字压根没有面试,不加上到了最后交流水学历资料的时候又被卡死,这种情况遇到的太多太多,我现在的心情只能用一个诗来描述,那就是: 一句诗:”哎“

啥都不说了,直接上代码:

import 'package:flutter/material.dart';import '../../widgets/xy_app_bar.dart';class XieChengHomePage extends StatefulWidget {const XieChengHomePage({Key? key}) : super(key: key);@overrideState<StatefulWidget> createState() {return XieChengHomePageState();}
}class XieChengHomePageState extends State<XieChengHomePage> with TickerProviderStateMixin {late TabController tabController;List<String> tabs = ["飞机票","火车高铁票","公交车",];@overridevoid initState() {super.initState();tabController = TabController(length: 3, vsync: this);}@overrideWidget build(BuildContext context) {return MaterialApp(home: Scaffold(backgroundColor: Colors.red,appBar: XYAppBar(title: "Trapezoid Indicator Example",onBack: () {Navigator.pop(context);},),body: Column(children: [Padding(padding:const EdgeInsets.symmetric(horizontal: 16, vertical: 16),child: CustomTabbarWidget(tabController: tabController,tabs: tabs,),),Expanded(child: TabBarView(controller: tabController,children: const [Center(child: Text('Tab 1 Content')),Center(child: Text('Tab 2 Content')),Center(child: Text('Tab 3 Content')),],),),],)),);}
}class CustomTabbarWidget extends StatefulWidget {final TabController tabController;final List<String> tabs;const CustomTabbarWidget({Key? key,required this.tabController,required this.tabs,}) : super(key: key);@overrideState<StatefulWidget> createState() {return CustomTabbarState();}
}class CustomTabbarState extends State<CustomTabbarWidget> {@overridevoid initState() {super.initState();widget.tabController.addListener(() {setState(() {});});}@overrideWidget build(BuildContext context) {return LayoutBuilder(builder: (context, constraints) {var tabWidth = constraints.maxWidth / widget.tabs.length;var currentWidth = tabWidth * 1.5;var offset =(constraints.maxWidth - currentWidth) / (widget.tabs.length - 1);return Container(width: constraints.maxWidth,child: Stack(children: [SizedBox(width: constraints.maxWidth,height: 60,),Positioned(bottom: 0,left: 0,right: 0,child: Container(height: 50,decoration: BoxDecoration(color: Colors.white.withAlpha(80),borderRadius: const BorderRadius.only(topLeft: Radius.circular(8),topRight: Radius.circular(8),),),child: Row(children: widget.tabs.asMap().keys.map((index) {return AnimatedContainer(duration: const Duration(milliseconds: 200),width: index == widget.tabController.index? currentWidth: offset,child: InkWell(key: ObjectKey(index),onTap: () {widget.tabController.animateTo(index);setState(() {});},child: Container(alignment: Alignment.center,child: Text(widget.tabs[index],style: const TextStyle(fontSize: 14),),),),);}).toList(),),),),AnimatedPositioned(duration: const Duration(milliseconds: 300),left: widget.tabController.index * offset,bottom: 0,child: IgnorePointer(child: ClipPath(clipper:TrapezoidClipper(tabController: widget.tabController),child: Container(height: 60,alignment: Alignment.center,width: currentWidth,decoration: const BoxDecoration(color: Colors.white,borderRadius: BorderRadius.only(topLeft: Radius.circular(8),topRight: Radius.circular(8)),),child: Column(mainAxisAlignment: MainAxisAlignment.center,children: [Expanded(child: Center(child: Text(widget.tabs[widget.tabController.index],style: const TextStyle(fontSize: 18, color: Colors.blue),),),),TextUnderline(text: widget.tabs[widget.tabController.index],style: const TextStyle(fontSize: 18, color: Colors.blue),lineColor: Colors.blue,height: 4),],)),),),),],),);});}
}class TrapezoidClipper extends CustomClipper<Path> {TrapezoidClipper({required this.tabController});TabController tabController;@overridePath getClip(Size size) {var isLeft = tabController.index == 0;var isRight = tabController.index == tabController.length - 1;double inset = size.width * 0.1;double radius = 8.0;// path.moveTo(isLeft ? 0 : inset, 0);// path.lineTo(isRight ? size.width : size.width - inset, 0);// path.lineTo(size.width, size.height);// path.lineTo(0, size.height);final path = Path()..moveTo(radius, 0) // 移动到起始点..lineTo(size.width - radius, 0) // 顶边线..quadraticBezierTo(size.width, 0, size.width, radius) // 右上角圆角..lineTo(size.width, size.height - radius) // 右边线..quadraticBezierTo(size.width, size.height, size.width - radius, size.height) // 右下角圆角..lineTo(radius, size.height) // 底边线..quadraticBezierTo(0, size.height, 0, size.height - radius) // 左下角圆角..lineTo(0, radius) // 左边线..quadraticBezierTo(0, 0, radius, 0); // 左上角圆角path.close();return path;}@overridebool shouldReclip(CustomClipper<Path> oldClipper) => true;
}class TextUnderline extends StatelessWidget {const TextUnderline({Key? key,required this.text,required this.style,required this.lineColor,required this.height,}) : super(key: key);final String text;final TextStyle style;final Color lineColor;final double height;@overrideWidget build(BuildContext context) {final textPainter = TextPainter(text: TextSpan(text: text,style: style,),textDirection: TextDirection.ltr,);textPainter.layout();var textWidth = textPainter.width;return Container(width: textWidth,height: height,decoration: BoxDecoration(borderRadius: BorderRadius.all(Radius.circular(height),),color: lineColor,),);}
}

github.com/yixiaolunhui/flutter_xy

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/764924.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于modbus TCP实现EPICS与西门子S7 1200系列1215C PLC的通信

PLC介绍 西门子系列PLC在国内的市场占比第一&#xff0c;1200系列中小型PLC&#xff0c;因其众多的产品序列、强大的通讯功能和丰富扩展模块&#xff0c;被使用在工业生产、自动化生产线、智能制造、机器人等各行各业。根据CPU的供电电源的型号和数字量输出的类型&#xff0c;…

专业130+总分410+西南交通大学924信号与系统考研经验西南交大电子信息通信工程,真题,大纲,参考书。

初试分数出来&#xff0c;专业课924信号与系统130&#xff0c;总分410&#xff0c;整体上发挥正常&#xff0c;但是还有遗憾&#xff0c;其实自己可以做的更好&#xff0c;总结一下经验&#xff0c;希望对大家有所帮助。专业课&#xff1a;&#xff08;130&#xff09; 西南交…

【技术栈】Spring Cache 简化 Redis 缓存使用

​ SueWakeup 个人主页&#xff1a;SueWakeup 系列专栏&#xff1a;学习技术栈 个性签名&#xff1a;保留赤子之心也许是种幸运吧 ​ 本文封面由 凯楠&#x1f4f8; 友情提供 目录 本栏传送门 1. Spring Cache 介绍 2. Spring Cache 常用注解 注&#xff1a;手机端浏览本文章…

DS-红黑树(RBTree)

一.红黑树 1.1 红黑树的起源 当对对AVL树做一些结构修改的操作时候&#xff0c;性能较为低下&#xff0c;比如&#xff1a;插入时要维护其绝对平衡&#xff0c;旋转的次数比较多&#xff0c;更差的是在删除时&#xff0c;有可能一直要让旋转持续到根的位置。 因此1972年Rudolf…

YOLOv8独家改进:backbone改进 | 视觉新主干!RMT:RetNet遇见视觉Transformer | CVPR2024

💡💡💡本文独家改进:RMT:一种强大的视觉Backbone,灵活地将显式空间先验集成到具有线性复杂度的视觉主干中,在多个下游任务(分类/检测/分割)上性能表现出色! 💡💡💡Transformer 在各个领域验证了可行性,在多个数据集下能够实现涨点 改进结构图如下: 收录 …

Canine IP-10/CXCL 10 ELISA试剂盒上新

科研用Canine IP-10/CXCL 10 ELISA试剂盒重磅来袭&#xff0c;将在免疫学、癌症研究与神经科学等多个领域助力各位老师们的研究&#xff01; 图1&#xff1a;犬IP-10/CXCL10结构预测&#xff08;图片来源&#xff1a;UniProt&#xff09; C-X-C基序趋化因子(C-X-C motif chemok…

pytorch中的gather函数的定义和作用是什么?

在PyTorch中&#xff0c;gather函数是一个用于从张量&#xff08;tensor&#xff09;中收集特定索引位置上的元素的函数。它主要用于高级索引和从张量中提取特定信息。 定义&#xff08;python&#xff09; gather函数的基本定义如下&#xff1a; torch.gather(input, dim, i…

4.2 RK3399项目开发实录-案例开发之OpenCV 编译和安装(wulianjishu666)

★嵌入式ARM开发全套案例代码&#xff1a;https://pan.baidu.com/s/1ksCQN__jD8ZrJhw8sWzhwQ?pwdvvfz 3.3. OpenCV 编译和安装 不少客户遇到OpenCV的问题多集中在如何获取mipi摄像头的数据。因为OpenCV使用的V4l2协议和Rockchip编写的mipi摄像头驱动协议不同&#xff0c;所以…

算法-排序,查找

1.排序 常用的排序算法有快速排序&#xff0c;归并排序&#xff0e; (1). 快速排序 以下是快速排序的基本步骤&#xff1a; a. 选择一个基准元素&#xff1a;通常选择序列的第一个元素作为基准元素。 b. 划分过程&#xff1a;将待排序的序列重新排序&#xff0c;所有比基准元素…

从零开始搭建游戏服务器 第六节 合理使用自定义注解+反射 简化开发流程

自定义注解 前言正文创建注解创建类扫描工具创建ProtoDispatcher类初始化Dispatcher协议的逻辑分发dispatcher使用注解标记方法测试 结语 前言 在前面几节我们将Login服的大体架构搭建了起来&#xff0c; 具体流程是这样的&#xff1a; 客户端上传protobuf协议到LoginServerL…

基于飞凌嵌入式i.MX6ULL核心板的电梯智能物联网关方案

电梯是现代社会中不可或缺的基础性设施&#xff0c;为人们的生产生活提供了很大的便捷。我国目前正处于城镇化的快速发展阶段&#xff0c;由此带动的城市基础设施建设、楼宇建设、老破小改造等需求也让我国的电梯行业处在了一个高速增长期。截至2023年年底&#xff0c;中国电梯…

「Linux系列」Shell echo命令/printf命令/test命令

文章目录 一、Shell echo命令二、Shell printf命令三、Shell test命令四、相关链接 一、Shell echo命令 echo 是 Unix 和 Linux 系统中常用的一个命令&#xff0c;用于在终端输出字符串或变量的值。这个命令非常基础且常用&#xff0c;通常用于脚本编写、命令行操作等场合。 …

UE5 GameMode C++函数 学习

已经尝试&#xff0c;确实能重启游戏 类描述符加了noplaceable过后即使是Actor也不能放到场景中了&#xff0c;关卡蓝图&#xff0c;GameMode&#xff0c;GameState这些就不能放场景中了 UFUNCTION(exec)

ruoyi-nbcio-plus基于vue3的flowable增加开始节点的表单绑定修改

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…

Android Studio Gradle设置查看全部task

如果你在 Android Studio 的 Gradle 窗口中看不到所有的任务&#xff0c;你可以尝试以下步骤来解决这个问题 android studio 版本&#xff1a; Android Studio Iguana | 2023.2.1 Build #AI-232.10227.8.2321.11479570, built on February 22, 2024 打开 Android Studio 的设置…

行业官网:律师行业官网解决方案和案例

hello&#xff0c;我是大千UI工厂&#xff0c;从此篇开始介绍各行业官网建设的解决方案 和经典案例&#xff0c;本期介绍律师行业&#xff0c;欢迎老铁们关注、评论、如有设计需求可以私信我们。 一、高大上律师官网有什么作用 高大上官网对律师行业的作用主要体现在以下几个…

eNSP学习——GVRP基础配置

目录 一、什么是GVRP 二、实验内容 三、实验目的 四、实验步骤 五、实验拓扑 六、实验编址 七、实验步骤 7.1、基本配置 7.2、配置GVRP单向注册 7.3、配置GVRP双向注册 7.4、配置GVRP的Fixed模式 7.5、配置GVRP的Forbidden模式 需要完整的配置命令大全的可以点击链…

传输线和串扰(一):串扰的叠加以及耦合的起源

串扰是六大信号完整性问题之一。它是将不需要的信号从一个网络传输到相邻网络&#xff0c;并且发生在每对网络之间。网络包括信号路径和返回路径&#xff0c;它连接系统中的一个或多个节点。我们通常将具有噪声源的网络称为主动网络或攻击网络。产生噪声的网络称为安静网络或受…

Linux mkswap命令教程:如何设置Linux交换区(附实例详解和注意事项)

Linux mkswap命令介绍 mkswap命令用于在设备或文件上设置Linux交换区。设备参数通常是磁盘分区&#xff08;例如/dev/sdb7&#xff09;&#xff0c;但也可以是文件。Linux内核不查看分区ID&#xff0c;但许多安装脚本假定十六进制类型82&#xff08;LINUX_SWAP&#xff09;的分…

机器学习 - 训练模型

接着这一篇博客做进一步说明&#xff1a; 机器学习 - 选择模型 为了解决测试和预测之间的差距&#xff0c;可以通过更新 internal parameters, the weights set randomly use nn.Parameter() and bias set randomly use torch.randn(). Much of the time you won’t know what…