Flutter---CupertinoPicker滚动选择器

效果图

概念:CupertinoPicker 是 Flutter 框架中非常核心的一个滚动选择器组件(iOS 风格的滚动列表选择控件),广泛用于 iOS 风格的选择界面(比如选择日期、时间、选项等)。

特点:

  • 支持滚轮滑动选择(类似 iPhone 设置里的时间/日期选择器)

  • 样式自动带有 惯性滚动、回弹效果、居中高亮

  • 可自定义内容(不限于文字)

它有好几个参数,可以一个一个去试试,看效果

实现代码

Dart 复制代码
  void showPickerDialog() {
    int selectedIndex = 0;
    List<String> options = ['广州', '惠州', '深圳', '茂名', '东莞',"韶关"];

    final controller = FixedExtentScrollController(initialItem: 2);//初始选中项为深圳

    showDialog(
      context: context,
      builder: (context) {
        return AlertDialog(
          title: Text('请选择'),
          content: SizedBox(
            height: 200,

            child: CupertinoPicker(
              itemExtent: 40, //每个选项的高度
              //diameterRatio: 1.5, // 默认值 1.1,值越大透视效果越小(滑动效果)
              //magnification: 1, // 中间选项的放大倍数(放大选中的文字)
              //squeeze: 0.8, // 默认值 1.45,值越小选项间距越大
              //useMagnifier: true, // 是否使用放大镜效果(好像肉眼看不出什么效果)
              scrollController: controller,//控制初始选中项
              onSelectedItemChanged: (index) { //在滚动结束后触发
                selectedIndex = index;
              },
              children: options.map((option) {
                return Center(child: Text(option));
              }).toList(),
              //selectionOverlay: null,// 移除选择覆盖层

            ),


          ),

          actions: [
            TextButton(
              onPressed: () => Navigator.pop(context),
              child: Text('取消'),
            ),
            TextButton(
              onPressed: () {
                print('选择了: ${options[selectedIndex]}');
                Navigator.pop(context);
              },
              child: Text('确定'),
            ),
          ],
        );
      },
    );
  }

代码实例

home_page.dart

Dart 复制代码
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:my_flutter/person_information_page.dart';


class HomePage extends StatefulWidget{
  const HomePage({super.key});

  @override
  State<StatefulWidget> createState() => _HomePageState();

}

class _HomePageState extends State<HomePage> {



  @override
  Widget build(BuildContext context) {
    return Scaffold(

      //2.构建UI
      body: Container(
          height: double.infinity,//覆盖高
          width: double.infinity,//覆盖宽
          padding: const EdgeInsets.symmetric(vertical: 10,horizontal:10),//边内边距
          //主页背景颜色上下渐变
          decoration: const BoxDecoration(
            gradient: LinearGradient(
              begin: Alignment.topCenter,
              end: Alignment.centerRight,
              colors: [
                Colors.blue,
                Colors.white,
              ],
            ),
          ),
          child: GestureDetector(
              onTap:showPickerDialog ,//设置按钮的点击事件
              child: Column(
                children: [
                  SizedBox(height: 100,),
                  //按钮
                  Container(
                    //按钮大小
                      height: 50,
                      width: 400,
                      //按钮的样式
                      decoration: BoxDecoration(
                        color: Colors.white,
                        borderRadius: BorderRadius.circular(20),
                      ),
                      child: Center(
                        child: Text("CupertinoPicker滚动选择组件"),
                      )
                  ),
                  SizedBox(height: 20,),

                ],
              )
          )
      ),
    );
  }




  void showPickerDialog() {
    int selectedIndex = 0;
    List<String> options = ['广州', '惠州', '深圳', '茂名', '东莞',"韶关"];

    final controller = FixedExtentScrollController(initialItem: 2);//初始选中项为深圳

    showDialog(
      context: context,
      builder: (context) {
        return AlertDialog(
          title: Text('请选择'),
          content: SizedBox(
            height: 200,

            child: CupertinoPicker(
              itemExtent: 40, //每个选项的高度
              //diameterRatio: 1.5, // 默认值 1.1,值越大透视效果越小(滑动效果)
              //magnification: 1, // 中间选项的放大倍数(放大选中的文字)
              //squeeze: 0.8, // 默认值 1.45,值越小选项间距越大
              //useMagnifier: true, // 是否使用放大镜效果(好像肉眼看不出什么效果)
              scrollController: controller,//控制初始选中项
              onSelectedItemChanged: (index) { //在滚动结束后触发
                selectedIndex = index;
              },
              children: options.map((option) {
                return Center(child: Text(option));
              }).toList(),
              //selectionOverlay: null,// 移除选择覆盖层

            ),


          ),

          actions: [
            TextButton(
              onPressed: () => Navigator.pop(context),
              child: Text('取消'),
            ),
            TextButton(
              onPressed: () {
                print('选择了: ${options[selectedIndex]}');
                Navigator.pop(context);
              },
              child: Text('确定'),
            ),
          ],
        );
      },
    );
  }

}
相关推荐
colus_SEU10 小时前
【计算机网络笔记】第一章 计算机网络导论
笔记·计算机网络·1024程序员节
请你喝好果汁64110 小时前
ArchR——TSS_by_Unique_Frags.pdf
1024程序员节
安当加密10 小时前
如何通过掌纹识别实现Windows工作站安全登录:从技术原理到企业级落地实践
windows·安全·1024程序员节
m0_5642641810 小时前
SEO优化策略:从入门到精通的排名提升指南
搜索引擎·1024程序员节·seo策略
小涵11 小时前
企业SRE/DevOps向的精通Linux课程培训课程
linux·运维·devops·1024程序员节
Pu_Nine_911 小时前
Vue 3 + TypeScript 项目性能优化全链路实战:从 2.1MB 到 130KB 的蜕变
前端·vue.js·性能优化·typescript·1024程序员节
敲代码的瓦龙11 小时前
C语言?大小端!!!
c语言·开发语言·c++·1024程序员节
LxxNi9e11 小时前
day10.24
1024程序员节
瑞禧生物ruixibio12 小时前
4-ARM-PEG-Olefin(2)/Biotin(2),四臂聚乙二醇-烯烃/生物素多功能支链分子,多功能分子构建
1024程序员节