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('确定'),
            ),
          ],
        );
      },
    );
  }

}
相关推荐
yBmZlQzJ15 小时前
免费内网穿透-端口转发配置介绍
运维·经验分享·docker·容器·1024程序员节
金融小师妹2 天前
AI算法视角下非农夜冲击波来袭,黄金高位区间震荡态势的深度神经网络解析
大数据·深度学习·1024程序员节
全栈小54 天前
【数据库】浙人医携手金仓数据库,打造全国首个多院区异构多活容灾架构
数据库·1024程序员节·金仓
CoderYanger6 天前
贪心算法:7.最长连续递增序列
java·算法·leetcode·贪心算法·1024程序员节
CoderYanger6 天前
贪心算法:6.递增的三元子序列
java·算法·leetcode·贪心算法·1024程序员节
CoderYanger6 天前
贪心算法:1.柠檬水找零
java·算法·leetcode·贪心算法·1024程序员节
CoderYanger6 天前
贪心算法:4.摆动序列
java·算法·leetcode·贪心算法·1024程序员节
CoderYanger6 天前
贪心算法:2.将数组和减半的最少操作次数
java·算法·leetcode·贪心算法·1024程序员节
CoderYanger6 天前
贪心算法:8.买卖股票的最佳时机
java·算法·leetcode·贪心算法·1024程序员节
CoderYanger6 天前
贪心算法:3.最大数
java·算法·leetcode·贪心算法·1024程序员节