flutter开发实战-ListWheelScrollView与自定义TimePicker时间选择器

flutter开发实战-ListWheelScrollView与自定义TimePicker

最近在使用时间选择器的时候,需要自定义一个TimePicker效果,当然这里就使用了ListWheelScrollView。ListWheelScrollView与ListView类似,但ListWheelScrollView渲染效果类似滚筒效果。
在这里插入图片描述

一、ListWheelScrollView

基本用法

  ListWheelScrollView({
    super.key,
    this.controller,
    this.physics,
    this.diameterRatio = RenderListWheelViewport.defaultDiameterRatio,
    this.perspective = RenderListWheelViewport.defaultPerspective,
    this.offAxisFraction = 0.0,
    this.useMagnifier = false,
    this.magnification = 1.0,
    this.overAndUnderCenterOpacity = 1.0,
    required this.itemExtent,
    this.squeeze = 1.0,
    this.onSelectedItemChanged,
    this.renderChildrenOutsideViewport = false,
    this.clipBehavior = Clip.hardEdge,
    this.restorationId,
    this.scrollBehavior,
    required List<Widget> children,
  })
    

ListWheelScrollView的一些属性,如children是子控件

  • children是子控件,
  • itemExtent是每个item的高度
  • magnification是圆筒直径和主轴渲染窗口的尺寸比,默认值是2
  • perspective是圆柱投影试图,为0表示从无限远处看,1表示从无限近处看。默认值0.003
  • offAxisFraction表示圆筒水平偏移中心的程度
  • magnification与useMagnifier放大镜,分辨设置放大镜与放大倍率。
  • squeeze表示圆筒上子控件数量与在同等大小的平面上的子控件的数量之比。

看下ListWheelScrollView基本用法

Container(
          height: 250,
         child: ListWheelScrollView(
            itemExtent: 50,
            children: [
              Container(
                color: Colors.red,
              ),
              Container(
                color: Colors.orangeAccent,
              ),
              Container(
                color: Colors.yellow,
              ),
              Container(
                color: Colors.green,
              ),
              Container(
                color: Colors.teal,
              ),
              Container(
                color: Colors.blue,
              ),
              Container(
                color: Colors.purple,
              ),
            ],
          ),
        )
    

效果图如下
在这里插入图片描述
如果将diameterRatio调整为1的

效果图如下

在这里插入图片描述

其他属性的效果可以逐个尝试一下。

如果使用的数据比较多时候,可以使用userDelegate方式, 使用ListWheelChildBuilderDelegate来指定builder与childCount.

 Container(
          height: 350,
          child: ListWheelScrollView.useDelegate(
            itemExtent: 50,
            diameterRatio: 2,
            childDelegate:
                ListWheelChildBuilderDelegate(builder: (context, index) {
              return Container(
                color: Colors.lightBlue,
                alignment: Alignment.center,
                child: Text("$index",
                    style: TextStyle(color: Colors.white, shadows: [
                      Shadow(
                          color: Colors.black,
                          offset: Offset(.5, .5),
                          blurRadius: 2)
                    ])),
              );
            }, childCount: 100),
          ),
        );
    

效果图如下

在这里插入图片描述
当然还有一个ListWheelChildLoopingListDelegate可以表现出来循环滚动的效果

final List dataList = [
    "第1行",
    "第2行",
    "第3行",
    "第4行",
    "第5行",
    "第6行",
    "第7行",
    "第8行",
    "第9行",
    "第10行",
  ];

  Widget buildChildItem(String text) {
    return Container(
      color: Colors.lightBlue,
      alignment: Alignment.center,
      child: Text("$text",
          style: TextStyle(color: Colors.white, shadows: [
            Shadow(
                color: Colors.black,
                offset: Offset(.5, .5),
                blurRadius: 2)
          ])),
    );
  }

  void testListWheelScrollViewDelegate(BuildContext context) {
    showModalBottomSheet(
      context: context,
      isScrollControlled: true,
      builder: (ctx) {
        return Container(
          height: 350,
          child: ListWheelScrollView.useDelegate(
            itemExtent: 50,
            diameterRatio: 2,
            childDelegate: ListWheelChildLoopingListDelegate(children: dataList.map((e) => buildChildItem(e)).toList())),
        );
      },
    );
  }
    

效果图如下

在这里插入图片描述

二、自定义TimePicker

自定义TimePicker使用ListWheelScrollView
自定义TimePicker有小时和分钟,左边显示小时,右边显示分钟。点击确定确认选择的时间,时间格式为10:20
onSelectedItemChanged来确认选择的item
在这里插入图片描述
完整代码如下


class CustomTimePicker extends StatefulWidget {
  const CustomTimePicker({
    super.key,
    this.width,
    this.height,
  });

  final double? width;
  final double? height;

  @override
  State<CustomTimePicker> createState() => _CustomTimePickerState();
}

class _CustomTimePickerState extends State<CustomTimePicker> {
  List<String> hourData = [];
  List<String> minuteData = [];

  String selectedHour = "";
  String selectedminute = "";

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    for (int i = 0; i < 24; i++) {
      String hour = i.toString();
      if (i < 10) {
        hour = "0" + i.toString();
      }
      hourData.add(hour);
    }

    for (int i = 0; i < 60; i++) {
      String minute = i.toString();
      if (i < 10) {
        minute = "0" + i.toString();
      }
      minuteData.add(minute);
    }
  }

  @override
  void dispose() {
    // TODO: implement dispose
    super.dispose();
  }

  Widget buildItem(String text) {
    return Text(
      text,
      textAlign: TextAlign.center,
      softWrap: true,
      style: TextStyle(
        fontSize: 20,
        fontWeight: FontWeight.w500,
        fontStyle: FontStyle.normal,
        color: Color(0xFF333333),
        decoration: TextDecoration.none,
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Container(
        width: widget.width,
        height: widget.height,
        color: Colors.white,
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Container(
              width: widget.width,
              height: 50,
              child: Row(
                mainAxisAlignment: MainAxisAlignment.center,
                crossAxisAlignment: CrossAxisAlignment.center,
                children: [
                  TextButton(
                    onPressed: () {
                      Navigator.of(context).pop();
                    },
                    child: Container(
                      height: 36,
                      width: 100,
                      color: Colors.transparent,
                      alignment: Alignment.center,
                      child: Text(
                        '取消',
                        style: TextStyle(fontSize: 15, color: Colors.black87),
                      ),
                    ),
                  ),
                  Expanded(
                    child: Text(
                      '${selectedHour}:${selectedminute}',
                      textAlign: TextAlign.center,
                      style: TextStyle(fontSize: 16, color: Colors.black87),
                    ),
                  ),
                  TextButton(
                    onPressed: () {
                      Navigator.of(context).pop();
                    },
                    child: Container(
                      height: 36,
                      width: 100,
                      alignment: Alignment.center,
                      child: Text(
                        '确定',
                        style: TextStyle(fontSize: 15, color: Colors.blue),
                      ),
                    ),
                  ),
                ],
              ),
            ),
            Expanded(
              child: Row(
                mainAxisAlignment: MainAxisAlignment.center,
                crossAxisAlignment: CrossAxisAlignment.center,
                children: [
                  Container(
                    width: 150,
                    height: widget.height,
                    child: Scrollable(
                      axisDirection: AxisDirection.down,
                      physics: BouncingScrollPhysics(),
                      dragStartBehavior: DragStartBehavior.start,
                      viewportBuilder: (ctx, position) =>
                          ListWheelScrollView.useDelegate(
                        itemExtent: 44,
                        squeeze: 1,
                        diameterRatio: 3,
                        useMagnifier: true,
                        overAndUnderCenterOpacity: 0.8,
                        magnification: 1.1,
                        onSelectedItemChanged: (index) {
                          String hour = hourData[index];
                          print("hour:${hour}");
                          setState(() {
                            selectedHour = hour;
                          });
                        },
                        childDelegate: ListWheelChildLoopingListDelegate(
                            children:
                                hourData.map((e) => buildItem(e)).toList()),
                      ),
                    ),
                  ),
                  Container(
                    width: 150,
                    height: widget.height,
                    child: Scrollable(
                      axisDirection: AxisDirection.down,
                      physics: BouncingScrollPhysics(),
                      dragStartBehavior: DragStartBehavior.start,
                      viewportBuilder: (ctx, position) =>
                          ListWheelScrollView.useDelegate(
                        itemExtent: 44,
                        squeeze: 1,
                        diameterRatio: 3,
                        useMagnifier: true,
                        overAndUnderCenterOpacity: 0.8,
                        magnification: 1.1,
                        onSelectedItemChanged: (index) {
                          String minute = minuteData[index];
                          print("minute:${minute}");
                          setState(() {
                            selectedminute = minute;
                          });
                        },
                        childDelegate: ListWheelChildLoopingListDelegate(
                            children:
                                minuteData.map((e) => buildItem(e)).toList()),
                      ),
                    ),
                  ),
                ],
              ),
            ),
          ],
        ));
  }
}

    

效果图如下

在这里插入图片描述

三、小结

flutter开发实战-ListWheelScrollView与自定义TimePicker

学习记录,每天不停进步。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Oracle新特性速递:未来数据库技术的无限可能

文章目录 一、自治数据库&#xff1a;智能化与自动化的革命二、机器学习集成&#xff1a;智能数据分析的新境界三、区块链技术&#xff1a;确保数据完整性与透明性四、云原生数据库&#xff1a;灵活扩展与快速部署五、人工智能优化器&#xff1a;智能查询执行计划《Oracle从入门…

上海约瑟电器 JOBS(KG9001)拉绳开关 严格质量细节监控

基本信息 品牌&#xff1a;JOSEF约瑟 型号&#xff1a;JOBS(KG9001) 技术参数 动作角度&#xff1a;30 电源电压&#xff1a;220V 工作电压&#xff1a;380V 额定电流&#xff1a;5A 防护等级&#xff1a;IP65 复位方式&#xff1a;支持自动&#xff08;I&#xff09;和手动&am…

高考填报志愿三连问,从人格优势分析兴趣和专业

“我的兴趣爱好什么&#xff1f;” “我的理想是什么&#xff1f;” “我想成为什么&#xff1f;” ------高考填报志愿三连问&#xff01; 最近我在知乎上看过一个比较有意义的提问&#xff0c;提问的也是高考填报志愿的同学&#xff0c;自从高考后&#xff0c;每日三连问&…

Python基于逻辑回归分类模型、决策树分类模型、LightGBM分类模型和XGBoost分类模型实现车辆贷款违约预测项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 随着经济的发展和人民生活水平的提高&#xff0c;汽车消费在居民消费中所占比例逐渐增加&#xff0c;汽…

华为实训案例

案例下载 拓扑图 任务清单 &#xff08;一&#xff09;基础配置 根据附录1拓扑图、附录2地址规划表、附录3设备编号表&#xff0c;配置设备接口及主机名信息。 将所有终端超时时间设置为永不超时。 在全网Trunk链路上做VLAN修剪&#xff0c;仅允许必要的流量通过&#xff0…

什么是GPIO口,GPIO口最简单的input/output

目录 一&#xff0c;什么是GPIO口 二&#xff0c;GPIO内部结构 三&#xff0c;GPIO口工作模式 一&#xff0c;什么是GPIO口 1.GPIO口是通用输入输出端口&#xff08;General-purpose input/output&#xff09;的英文缩写&#xff0c;是所有的微控制器必不可少的外设之一&…

基于C++标准库实现定时器类

基于C标准库实现定时器类 定时器类是多线程编程中经常设计到的工具类 简单的定时器原理其实很简单&#xff08;是不是有点GNU is not unix的味道;&#xff09;&#xff1a; 创建一个新线程在那个线程里等待等待指定时长后做任务 python标准库中就有这么一个定时器类&#xf…

车载测试工程师在行业中有哪些挑战需要面对?

车载测试工程师在行业中面临着多方面的挑战&#xff0c;这些挑战涵盖了技术、安全、法规以及市场环境等多个层面。 1. 技术挑战&#xff1a; 复杂性与集成性&#xff1a;现代汽车系统由众多模块和子系统组成&#xff0c;包括发动机控制、安全系统、娱乐系统、导航系统等。这些系…

查普曼大学团队使用惯性动捕系统制作动画短片

道奇电影和媒体艺术学院是查普曼大学的知名学院&#xff0c;同时也是美国首屈一指的电影学院之一&#xff0c;拥有一流电影制作工作室。 最近&#xff0c;道奇学院的一个学生制作团队接手了一个项目&#xff0c;该项目要求使用真人动作、视觉效果以及真人演员和CG角色之间的互动…

鸿蒙NEXT开发知识:工具常用命令—ohpm config

设置ohpm用户级配置项。 命令格式 ohpm config set <key> <value> ohpm config get <key> ohpm config delete <key> ohpm config list 说明 配置文件中信息以键值对<key> <value>形式存在。 功能描述 ohpm 从命令行和 .ohpmrc 文件中…

AI专区上新啦!豆包、通义、360AI、天工AI、澜舟智库等入驻麒麟软件商店

继百度文心一言、讯飞星火、博思白板、雅意等AI产品上架后&#xff0c;麒麟软件商店再添新成员&#xff01;近日&#xff0c;豆包、通义、360AI搜索、360智脑、360智绘、昆仑万维天工AI、澜舟智库等重磅AI产品登陆麒麟软件商店人工智能专区&#xff0c;涵盖了AI对话、AI写作、A…

普乐蛙景区9d电影体验馆商场影院娱乐设备旋转飞行影院

今天与大家聊聊VR娱乐新潮流&#xff0c;我们普乐蛙的新品——旋转飞行影院&#xff01;裸眼7D环幕影院&#xff0c;话不多说上产品&#xff01;我们通过亲身体验来给大家讲讲这款高性价比新品的亮点。 想象一下走上电动伸缩梯&#xff0c;坐进动感舱&#xff0c;舱门缓缓合上&…

MySQL实训项目——餐饮点餐系统

项目简介&#xff1a;餐饮点餐系统是一款为餐厅和顾客提供便捷点餐服务的在线平台。通过该系统&#xff0c;餐厅能够展示其菜单&#xff0c;顾客可以浏览菜品&#xff0c;并将其加入购物车或直接下单。系统还提供了订单管理功能&#xff0c;方便餐厅跟踪和处理顾客的订单。 1. …

【隐私计算】对SIMD编码的粗浅理解

首先需要知道&#xff0c;同态加密是在多项式上进行的&#xff0c;基于RLEW的整体流程如下&#xff1a; 将单个数编码到一个N阶&#xff08;N项&#xff09;多项式中&#xff0c;多项式系数的利用率极低。而在神经网络中&#xff0c;我们需要计算的东西往往是一个很大的矩阵/te…

docker部署EKF

1.检查版本 检查当前系统的docker版本 [rootnode1 ~]# docker version Client: Docker Engine - CommunityVersion: 20.10.12API version: 1.41Go version: go1.16.12Git commit: e91ed57Built: Mon Dec 13 11:45:41 2021OS/Arch: …

【ajax实战07】文章筛选功能

本文章目标&#xff1a;根据筛选条件&#xff0c;获取匹配数据展示 本章**“查询参数对象”指的是&#xff0c;要“获取文章列表”功能**中服务器接口要求配置的对象 实现步骤如下&#xff1a; 一&#xff1a;设置频道列表数据 二&#xff1a;监听筛选条件改变&#xff0c;…

侯捷C++面向对象高级开发(上)-1-头文件与类的声明

1.数据和函数比较 2.代码基本形式 3.c vs c输出 4.头文件防卫式声明 5.头文件布局 6.class模板简介

MoneyPrinterPlus:AI自动短视频生成工具-微软云配置详解

MoneyPrinterPlus可以使用大模型自动生成短视频&#xff0c;我们可以借助Azure提供的语音服务来实现语音合成和语音识别的功能。 Azure的语音服务应该是我用过的效果最好的服务了&#xff0c;微软还得是微软。 很多小伙伴可能不知道应该如何配置&#xff0c;这里给大家提供一…

Vip-智能预估+大数据标签+人群全选=用户分群!

Mobpush用户分群功能升级&#xff0c;创建推送入口vip用户可进入自有选择标签创建“用户分群”&#xff0c;相比于免费标签&#xff0c;“用户标签”维度更丰富。在应用基础属性上&#xff0c;增加“品牌”、“网络状态”、“运营商”&#xff0c;众所周知&#xff0c;不同厂商…

vue-主题切换

themeName/index.vue页面: <template><div class"theme-view"><div click"themeClick" class"theme-btn">切换颜色</div><br>{{themeName white ? 白色 : 深色}}主题页面</div> </template><sc…