美文网首页
Flutter 之 日期时间选择器(iOS 风格)(九十一)

Flutter 之 日期时间选择器(iOS 风格)(九十一)

作者: maskerII | 来源:发表于2022-05-31 19:01 被阅读0次

    CupertinoDatePicker、CupertinoTimerPicker 是 iOS 风格的 DatePickerView 和 TimePickerView 的日期时间选择器。

    1. CupertinoTimerPicker

    CupertinoDatePicker 定义

      CupertinoDatePicker({
        Key? key,
        this.mode = CupertinoDatePickerMode.dateAndTime,
        required this.onDateTimeChanged,
        DateTime? initialDateTime,
        this.minimumDate,
        this.maximumDate,
        this.minimumYear = 1,
        this.maximumYear,
        this.minuteInterval = 1,
        this.use24hFormat = false,
        this.dateOrder,
        this.backgroundColor,
      })
    

    CupertinoDatePicker 属性

    CupertinoDatePicker 属性 介绍
    mode CupertinoDatePickerMode 日期选择器模式 ,time,date,dateAndTime, 默认dateAndTime
    onDateTimeChanged @required 选中日期变化回调
    initialDateTime 当前日期
    minimumDate 最小可选日期
    maximumDate 最大可选日期
    minimumYear 最小年份
    maximumYear 最大年份
    minuteInterval 分钟间隔 initialDateTime.minute 必须可以整除 minuteInterval 必须是 60 的整数因子
    use24hFormat 是否使用24小时制
    dateOrder 期选择器排序方式 默认年/月/日
    backgroundColor 背景色

    2. CupertinoDatePicker 实例

    注意:取消、确认按钮是自己绘制的,不是cupertinoDatePicker提供的

    示例1 CupertinoDatePickerMode.date

            final CupertinoDatePicker cupertinoDatePicker = CupertinoDatePicker(
              mode: CupertinoDatePickerMode
                  .date, // 日期选择器模式 `time`,`date`,`dateAndTime`, 默认`dateAndTime`
              initialDateTime: DateTime.now(), // 初始化日期
              minimumDate: DateTime(2021, 10, 10), // 最小可选日期
              maximumDate: DateTime(2023, 12, 22), // 最大可选日期
              minimumYear: 2020, // 最小年份
              maximumYear: 2025, // 最大年份
              minuteInterval:
                  1, // 分钟间隔  initialDateTime.minute 必须可以整除 minuteInterval 必须是 60 的整数因子
              use24hFormat: true, // 是否使用24小时制
              dateOrder: DatePickerDateOrder.dmy, // 日期选择器排序方式 默认年/月/日
              backgroundColor: Colors.white,
              // 选中日期变化回调
              onDateTimeChanged: (dateTime) {
                _chooseDateTime = dateTime;
              },
            );
    
    image.png

    示例2 CupertinoDatePickerMode.dateAndTime

            final CupertinoDatePicker cupertinoDatePicker = CupertinoDatePicker(
              mode: CupertinoDatePickerMode
                  .dateAndTime, // 日期选择器模式 `time`,`date`,`dateAndTime`, 默认`dateAndTime`
              initialDateTime: DateTime.now(), // 初始化日期
              minimumDate: DateTime(2021, 10, 10), // 最小可选日期
              maximumDate: DateTime(2023, 12, 22), // 最大可选日期
              minimumYear: 2020, // 最小年份
              maximumYear: 2025, // 最大年份
              minuteInterval:
                  1, // 分钟间隔  initialDateTime.minute 必须可以整除 minuteInterval 必须是 60 的整数因子
              use24hFormat: false, // 是否使用24小时制
              dateOrder: DatePickerDateOrder.ymd, // 日期选择器排序方式 默认年/月/日
              backgroundColor: Colors.white,
              // 选中日期变化回调
              onDateTimeChanged: (dateTime) {
                _chooseDateTime = dateTime;
              },
            );
    
    image.png

    示例3 CupertinoDatePickerMode.time

            final CupertinoDatePicker cupertinoDatePicker = CupertinoDatePicker(
              mode: CupertinoDatePickerMode
                  .time, // 日期选择器模式 `time`,`date`,`dateAndTime`, 默认`dateAndTime`
              initialDateTime: DateTime.now(), // 初始化日期
              minimumDate: DateTime(2021, 10, 10), // 最小可选日期
              maximumDate: DateTime(2023, 12, 22), // 最大可选日期
              minimumYear: 2020, // 最小年份
              maximumYear: 2025, // 最大年份
              minuteInterval:
                  1, // 分钟间隔  initialDateTime.minute 必须可以整除 minuteInterval 必须是 60 的整数因子
              use24hFormat: false, // 是否使用24小时制
              dateOrder: DatePickerDateOrder.ymd, // 日期选择器排序方式 默认年/月/日
              backgroundColor: Colors.white,
              // 选中日期变化回调
              onDateTimeChanged: (dateTime) {
                _chooseDateTime = dateTime;
              },
            );
    
    image.png

    3. CupertinoTimerPicker

    CupertinoTimerPicker 定义

      CupertinoTimerPicker({
        Key? key,
        this.mode = CupertinoTimerPickerMode.hms,
        this.initialTimerDuration = Duration.zero,
        this.minuteInterval = 1,
        this.secondInterval = 1,
        this.alignment = Alignment.center,
        this.backgroundColor,
        required this.onTimerDurationChanged,
      }) 
    

    CupertinoTimerPicker 属性

    CupertinoTimerPicker 属性 介绍
    mode CupertinoTimerPickerMode,时间选择器模式 ,hm,ms,hms,默认hms
    initialTimerDuration 初始化时间
    minuteInterval 分钟间隔
    secondInterval 秒钟间隔
    alignment 对齐方式
    backgroundColor 背景色
    onTimerDurationChanged @required ValueChanged<Duration> onTimerDurationChanged,选中时间变化回调

    4. CupertinoTimerPicker 实例

    示例1 CupertinoTimerPickerMode.hms

            final cupertinoTimerPicker = CupertinoTimerPicker(
              mode: CupertinoTimerPickerMode.hms, // 时间选择器模式
              initialTimerDuration: Duration(hours: 1), // 初始化时间
              minuteInterval: 5, // 分钟间隔
              secondInterval: 20, // 秒钟间隔
              alignment: Alignment.center, // 对齐方式
              backgroundColor: Colors.white, // 背景色
              // 选中时间变化回调
              onTimerDurationChanged: (dur) {
                chooseDuration = dur;
              },
            );
    
    image.png

    示例2 CupertinoTimerPickerMode.ms

            final cupertinoTimerPicker = CupertinoTimerPicker(
              mode: CupertinoTimerPickerMode.ms, // 时间选择器模式
              initialTimerDuration: Duration(minutes: 10), // 初始化时间
              minuteInterval: 5, // 分钟间隔
              secondInterval: 20, // 秒钟间隔
              alignment: Alignment.center, // 对齐方式
              backgroundColor: Colors.white, // 背景色
              // 选中时间变化回调
              onTimerDurationChanged: (dur) {
                chooseDuration = dur;
              },
            );
    
    image.png

    示例3 CupertinoTimerPickerMode.hm

            final cupertinoTimerPicker = CupertinoTimerPicker(
              mode: CupertinoTimerPickerMode.hm, // 时间选择器模式
              initialTimerDuration: Duration(minutes: 20), // 初始化时间
              minuteInterval: 5, // 分钟间隔
              secondInterval: 20, // 秒钟间隔
              alignment: Alignment.center, // 对齐方式
              backgroundColor: Colors.white, // 背景色
              // 选中时间变化回调
              onTimerDurationChanged: (dur) {
                chooseDuration = dur;
              },
            );
    
    image.png

    5. flutter_cupertino_datetime_picker 三方库

    dependencies:
      flutter_cupertino_datetime_picker: ^3.0.0
    

    示例1 - DateTimePickerMode.time

      _showDatePickerForTime(BuildContext context){
        iOSDatePicker.DatePicker.showDatePicker(
          context, // 上下文
          pickerMode: iOSDatePicker.DateTimePickerMode.time, // 选择器模式
          dateFormat: "HH:mm:ss", // 日期格式
          minuteDivider: 5, // 分钟间隔
          // 选择回调
          onConfirm: (DateTime dateTime, List<int> selectedIndex) {
            print("选择 $dateTime");
          },
          // 取消回调
          onCancel: () {},
          // 关闭回调
          onClose: () {},
          // 选中时间发生变化 回调
          onChange: (datetime, selectedIndex) {},
        );
      }
    
    image.png

    示例2 - DateTimePickerMode.datetime

      _showDatePickerForDateTime(BuildContext context){
        iOSDatePicker.DatePicker.showDatePicker(
          context,
          pickerMode: iOSDatePicker.DateTimePickerMode.datetime,
          minDateTime: DateTime(2022, 1, 10),
          maxDateTime: DateTime(2022, 10, 10),
          dateFormat: "yyyy|MM|dd HH:mm",
          onConfirm: (DateTime dateTime, List<int> selectedIndex) {
            print("选择 $dateTime");
          },
          onCancel: () {},
          onClose: () {},
          onChange: (datetime, selectedIndex) {},
        );
      }
    
    image.png

    示例3 - DateTimePickerMode.date

      _showDatePickerForDate(BuildContext context) {
        iOSDatePicker.DatePicker.showDatePicker(
          context,
          pickerMode: iOSDatePicker.DateTimePickerMode.date,
          minDateTime: DateTime(2022, 1, 10),
          maxDateTime: DateTime(2022, 10, 10),
          initialDateTime: DateTime.now(),
          dateFormat: "MM|dd,yyyy年",
          onConfirm: (DateTime dateTime, List<int> selectedIndex) {
            print("选择 $dateTime");
          },
          onCancel: () {},
          onClose: () {},
          onChange: (datetime, selectedIndex) {},
        );
      }
    
    image.png

    6. Demo

    MSCupertinoDateAndTimePickerDemo

    
    class MSCupertinoDateAndTimePickerDemo extends StatelessWidget {
      MSCupertinoDateAndTimePickerDemo({Key? key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(title: Text("MSCupertinoDateAndTimePickerDemo")),
          body: SingleChildScrollView(
            child: Center(
              child: Column(
                children: [
                  ElevatedButton(
                    onPressed: () async {
                      DateTime? dateTime =
                          await _showCupertinoDatePickerForDate(context);
                      if (dateTime == null) {
                        print("取消选择");
                      } else {
                        print("选择 $dateTime");
                      }
                    },
                    child: Text("CupertinoDatePicker-Date"),
                  ),
                  ElevatedButton(
                    onPressed: () async {
                      DateTime? dateTime =
                          await _showCupertinoDatePickerForDateAndTime(context);
                      if (dateTime == null) {
                        print("取消选择");
                      } else {
                        print("选择 $dateTime");
                      }
                    },
                    child: Text("CupertinoDatePicker-DateTime"),
                  ),
                  ElevatedButton(
                    onPressed: () async {
                      DateTime? dateTime =
                          await _showCupertinoDatePickerForTime(context);
                      if (dateTime == null) {
                        print("取消选择");
                      } else {
                        print("选择 $dateTime");
                      }
                    },
                    child: Text("CupertinoDatePicker-Time"),
                  ),
                  ElevatedButton(
                    onPressed: () async {
                      Duration? dur = await _showCupertinoTimePickerForHMS(context);
                      if (dur == null) {
                        print("取消选择");
                      } else {
                        print("选择 $dur");
                      }
                    },
                    child: Text("CupertinoTimerPicker-HMS"),
                  ),
                  ElevatedButton(
                    onPressed: () async {
                      Duration? dur = await _showCupertinoTimePickerForMS(context);
                      if (dur == null) {
                        print("取消选择");
                      } else {
                        print("选择 $dur");
                      }
                    },
                    child: Text("CupertinoTimerPicker-MS"),
                  ),
                  ElevatedButton(
                    onPressed: () async {
                      Duration? dur = await _showCupertinoTimePickerForHM(context);
                      if (dur == null) {
                        print("取消选择");
                      } else {
                        print("选择 $dur");
                      }
                    },
                    child: Text("CupertinoTimerPicker-HM"),
                  ),
                ],
              ),
            ),
          ),
        );
      }
    
      // CupertinoDatePicker
      DateTime? chooseDateTime;
      _getActions(BuildContext context) {
        final Widget actions = Container(
          alignment: AlignmentDirectional.centerEnd,
          constraints: const BoxConstraints(minHeight: 52.0),
          padding: const EdgeInsets.symmetric(horizontal: 8),
          color: Colors.white,
          child: OverflowBar(
            alignment: MainAxisAlignment.spaceBetween,
            spacing: 8,
            children: <Widget>[
              TextButton(
                onPressed: () {
                  Navigator.of(context).pop();
                },
                child: Text(
                  "取消",
                  textScaleFactor: 1.2,
                ),
              ),
              TextButton(
                onPressed: () {
                  Navigator.of(context).pop(chooseDateTime);
                },
                child: Text(
                  "确定",
                  textScaleFactor: 1.2,
                ),
              ),
            ],
          ),
        );
        return actions;
      }
    
      Future<DateTime?> _showCupertinoDatePickerForDate(BuildContext context) {
        return showCupertinoModalPopup(
          context: context,
          builder: (context) {
            final CupertinoDatePicker cupertinoDatePicker = CupertinoDatePicker(
              mode: CupertinoDatePickerMode
                  .date, // 日期选择器模式 `time`,`date`,`dateAndTime`, 默认`dateAndTime`
              initialDateTime: DateTime.now(), // 初始化日期
              minimumDate: DateTime(2021, 10, 10), // 最小可选日期
              maximumDate: DateTime(2023, 12, 22), // 最大可选日期
              minimumYear: 2020, // 最小年份
              maximumYear: 2025, // 最大年份
              minuteInterval:
                  1, // 分钟间隔  initialDateTime.minute 必须可以整除 minuteInterval 必须是 60 的整数因子
              use24hFormat: true, // 是否使用24小时制
              dateOrder: DatePickerDateOrder.dmy, // 日期选择器排序方式 默认年/月/日
              backgroundColor: Colors.white,
              // 选中日期变化回调
              onDateTimeChanged: (dateTime) {
                chooseDateTime = dateTime;
              },
            );
    
            // 初始化chooseDateTime
            chooseDateTime = cupertinoDatePicker.initialDateTime;
            return AnimatedContainer(
              duration: Duration(microseconds: 200),
              height: 300,
              width: double.infinity,
              child: Column(
                children: [
                  _getActions(context),
                  Expanded(
                    child: cupertinoDatePicker,
                  ),
                ],
              ),
            );
          },
        );
      }
    
      Future<DateTime?> _showCupertinoDatePickerForDateAndTime(
          BuildContext context) {
        return showCupertinoModalPopup(
          context: context,
          builder: (context) {
            final CupertinoDatePicker cupertinoDatePicker = CupertinoDatePicker(
              mode: CupertinoDatePickerMode
                  .dateAndTime, // 日期选择器模式 `time`,`date`,`dateAndTime`, 默认`dateAndTime`
              initialDateTime: DateTime.now(), // 初始化日期
              minimumDate: DateTime(2021, 10, 10), // 最小可选日期
              maximumDate: DateTime(2023, 12, 22), // 最大可选日期
              minimumYear: 2020, // 最小年份
              maximumYear: 2025, // 最大年份
              minuteInterval:
                  1, // 分钟间隔  initialDateTime.minute 必须可以整除 minuteInterval 必须是 60 的整数因子
              use24hFormat: false, // 是否使用24小时制
              dateOrder: DatePickerDateOrder.ymd, // 日期选择器排序方式 默认年/月/日
              backgroundColor: Colors.white,
              // 选中日期变化回调
              onDateTimeChanged: (dateTime) {
                chooseDateTime = dateTime;
              },
            );
    
            // 初始化chooseDateTime
            chooseDateTime = cupertinoDatePicker.initialDateTime;
    
            return AnimatedContainer(
              duration: Duration(microseconds: 200),
              height: 300,
              width: double.infinity,
              child: Column(
                children: [
                  _getActions(context),
                  Expanded(
                    child: cupertinoDatePicker,
                  ),
                ],
              ),
            );
          },
        );
      }
    
      Future<DateTime?> _showCupertinoDatePickerForTime(BuildContext context) {
        return showCupertinoModalPopup(
          context: context,
          builder: (context) {
            final CupertinoDatePicker cupertinoDatePicker = CupertinoDatePicker(
              mode: CupertinoDatePickerMode
                  .time, // 日期选择器模式 `time`,`date`,`dateAndTime`, 默认`dateAndTime`
              initialDateTime: DateTime.now(), // 初始化日期
              minimumDate: DateTime(2021, 10, 10), // 最小可选日期
              maximumDate: DateTime(2023, 12, 22), // 最大可选日期
              minimumYear: 2020, // 最小年份
              maximumYear: 2025, // 最大年份
              minuteInterval:
                  1, // 分钟间隔  initialDateTime.minute 必须可以整除 minuteInterval 必须是 60 的整数因子
              use24hFormat: false, // 是否使用24小时制
              dateOrder: DatePickerDateOrder.ymd, // 日期选择器排序方式 默认年/月/日
              backgroundColor: Colors.white,
              // 选中日期变化回调
              onDateTimeChanged: (dateTime) {
                chooseDateTime = dateTime;
              },
            );
            // 初始化chooseDateTime
            chooseDateTime = cupertinoDatePicker.initialDateTime;
            return AnimatedContainer(
              duration: Duration(microseconds: 200),
              height: 300,
              width: double.infinity,
              child: Column(
                children: [
                  _getActions(context),
                  Expanded(
                    child: cupertinoDatePicker,
                  ),
                ],
              ),
            );
          },
        );
      }
    
      // CupertinoTimerPicker
      Duration? chooseDuration;
      _getActions2(BuildContext context) {
        final Widget actions = Container(
          alignment: AlignmentDirectional.centerEnd,
          constraints: const BoxConstraints(minHeight: 52.0),
          padding: const EdgeInsets.symmetric(horizontal: 8),
          color: Colors.white,
          child: OverflowBar(
            alignment: MainAxisAlignment.spaceBetween,
            spacing: 8,
            children: <Widget>[
              TextButton(
                onPressed: () {
                  Navigator.of(context).pop();
                },
                child: Text(
                  "取消",
                  textScaleFactor: 1.2,
                ),
              ),
              TextButton(
                onPressed: () {
                  Navigator.of(context).pop(chooseDuration);
                },
                child: Text(
                  "确定",
                  textScaleFactor: 1.2,
                ),
              ),
            ],
          ),
        );
        return actions;
      }
    
      Future<Duration?> _showCupertinoTimePickerForHMS(BuildContext context) {
        return showCupertinoModalPopup(
          context: context,
          builder: (context) {
            final cupertinoTimerPicker = CupertinoTimerPicker(
              mode: CupertinoTimerPickerMode.hms, // 时间选择器模式
              initialTimerDuration: Duration(hours: 1), // 初始化时间
              minuteInterval: 5, // 分钟间隔
              secondInterval: 20, // 秒钟间隔
              alignment: Alignment.center, // 对齐方式
              backgroundColor: Colors.white, // 背景色
              // 选中时间变化回调
              onTimerDurationChanged: (dur) {
                chooseDuration = dur;
              },
            );
            chooseDuration = cupertinoTimerPicker.initialTimerDuration;
            return AnimatedContainer(
              duration: Duration(microseconds: 200),
              height: 268,
              width: double.infinity,
              child: Container(
                color: Colors.white,
                child: Column(
                  children: [
                    _getActions2(context),
                    Expanded(child: cupertinoTimerPicker),
                  ],
                ),
              ),
            );
          },
        );
      }
    
      Future<Duration?> _showCupertinoTimePickerForMS(BuildContext context) {
        return showCupertinoModalPopup(
          context: context,
          builder: (context) {
            final cupertinoTimerPicker = CupertinoTimerPicker(
              mode: CupertinoTimerPickerMode.ms, // 时间选择器模式
              initialTimerDuration: Duration(minutes: 10), // 初始化时间
              minuteInterval: 5, // 分钟间隔
              secondInterval: 20, // 秒钟间隔
              alignment: Alignment.center, // 对齐方式
              backgroundColor: Colors.white, // 背景色
              // 选中时间变化回调
              onTimerDurationChanged: (dur) {
                chooseDuration = dur;
              },
            );
            chooseDuration = cupertinoTimerPicker.initialTimerDuration;
            return AnimatedContainer(
              duration: Duration(microseconds: 200),
              height: 268,
              width: double.infinity,
              child: Container(
                color: Colors.white,
                child: Column(
                  children: [
                    _getActions2(context),
                    Expanded(child: cupertinoTimerPicker),
                  ],
                ),
              ),
            );
          },
        );
      }
    
      Future<Duration?> _showCupertinoTimePickerForHM(BuildContext context) {
        return showCupertinoModalPopup(
          context: context,
          builder: (context) {
            final cupertinoTimerPicker = CupertinoTimerPicker(
              mode: CupertinoTimerPickerMode.hm, // 时间选择器模式
              initialTimerDuration: Duration(minutes: 20), // 初始化时间
              minuteInterval: 5, // 分钟间隔
              secondInterval: 20, // 秒钟间隔
              alignment: Alignment.center, // 对齐方式
              backgroundColor: Colors.white, // 背景色
              // 选中时间变化回调
              onTimerDurationChanged: (dur) {
                chooseDuration = dur;
              },
            );
            chooseDuration = cupertinoTimerPicker.initialTimerDuration;
            return AnimatedContainer(
              duration: Duration(microseconds: 200),
              height: 268,
              width: double.infinity,
              child: Container(
                color: Colors.white,
                child: Column(
                  children: [
                    _getActions2(context),
                    Expanded(child: cupertinoTimerPicker),
                  ],
                ),
              ),
            );
          },
        );
      }
    }
    
    
    127.gif

    三方库flutter_cupertino_datetime_picker Demo

    import 'package:flutter/material.dart';
    
    import 'package:flutter_cupertino_datetime_picker/flutter_cupertino_datetime_picker.dart'
        as iOSDatePicker;
    
    class MSCupertinoDatetimePickerLibDemo extends StatelessWidget {
      const MSCupertinoDatetimePickerLibDemo({Key? key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(title: Text("三方日期选择库")),
          body: SingleChildScrollView(
            child: Center(
              child: Column(
                children: [
                  ElevatedButton(
                    onPressed: () {
                      _showDatePickerForTime(context);
                    },
                    child: Text("DatePicker-Time"),
                  ),
                  ElevatedButton(
                    onPressed: () {
                      _showDatePickerForDateTime(context);
                    },
                    child: Text("DatePicker-DateTime"),
                  ),
                  ElevatedButton(
                    onPressed: () {
                      _showDatePickerForDate(context);
                    },
                    child: Text("DatePicker-Date"),
                  ),
                ],
              ),
            ),
          ),
        );
      }
    
      _showDatePickerForTime(BuildContext context) {
        iOSDatePicker.DatePicker.showDatePicker(
          context, // 上下文
          pickerMode: iOSDatePicker.DateTimePickerMode.time, // 选择器模式
          dateFormat: "HH:mm:ss", // 日期格式
          minuteDivider: 5, // 分钟间隔
          // 选择回调
          onConfirm: (DateTime dateTime, List<int> selectedIndex) {
            print("选择 $dateTime");
          },
          // 取消回调
          onCancel: () {},
          // 关闭回调
          onClose: () {},
          // 选中时间发生变化 回调
          onChange: (datetime, selectedIndex) {},
        );
      }
    
      _showDatePickerForDateTime(BuildContext context) {
        iOSDatePicker.DatePicker.showDatePicker(
          context,
          pickerMode: iOSDatePicker.DateTimePickerMode.datetime,
          minDateTime: DateTime(2022, 1, 10),
          maxDateTime: DateTime(2022, 10, 10),
          dateFormat: "yyyy|MM|dd HH:mm",
          onConfirm: (DateTime dateTime, List<int> selectedIndex) {
            print("选择 $dateTime");
          },
          onCancel: () {},
          onClose: () {},
          onChange: (datetime, selectedIndex) {},
        );
      }
    
      _showDatePickerForDate(BuildContext context) {
        iOSDatePicker.DatePicker.showDatePicker(
          context,
          pickerMode: iOSDatePicker.DateTimePickerMode.date,
          minDateTime: DateTime(2022, 1, 10),
          maxDateTime: DateTime(2022, 10, 10),
          initialDateTime: DateTime.now(),
          dateFormat: "MM|dd,yyyy年",
          onConfirm: (DateTime dateTime, List<int> selectedIndex) {
            print("选择 $dateTime");
          },
          onCancel: () {},
          onClose: () {},
          onChange: (datetime, selectedIndex) {},
        );
      }
    }
    
    
    128.gif

    相关文章

      网友评论

          本文标题:Flutter 之 日期时间选择器(iOS 风格)(九十一)

          本文链接:https://www.haomeiwen.com/subject/fizzprtx.html