2023-12-14 10:02:52 +08:00
|
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
|
|
import 'package:star_lock/tools/pickers/address_picker/route/address_picker_route.dart';
|
|
|
|
|
|
import 'package:star_lock/tools/pickers/more_pickers/init_data.dart';
|
|
|
|
|
|
import 'package:star_lock/tools/pickers/more_pickers/route/multiple_link_picker_route.dart';
|
|
|
|
|
|
import 'package:star_lock/tools/pickers/more_pickers/route/multiple_picker_route.dart';
|
|
|
|
|
|
import 'package:star_lock/tools/pickers/more_pickers/route/single_picker_route.dart';
|
|
|
|
|
|
import 'package:star_lock/tools/pickers/style/default_style.dart';
|
|
|
|
|
|
import 'package:star_lock/tools/pickers/style/picker_style.dart';
|
|
|
|
|
|
import 'package:star_lock/tools/pickers/time_picker/model/date_mode.dart';
|
|
|
|
|
|
import 'package:star_lock/tools/pickers/time_picker/model/pduration.dart';
|
|
|
|
|
|
import 'package:star_lock/tools/pickers/time_picker/model/suffix.dart';
|
|
|
|
|
|
import 'package:star_lock/tools/pickers/time_picker/route/date_picker_route.dart';
|
2024-05-04 13:36:17 +08:00
|
|
|
|
|
2023-12-14 10:02:52 +08:00
|
|
|
|
// import 'package:flutter_pickers/address_picker/route/address_picker_route.dart';
|
|
|
|
|
|
// import 'package:flutter_pickers/more_pickers/init_data.dart';
|
|
|
|
|
|
// import 'package:flutter_pickers/more_pickers/route/multiple_link_picker_route.dart';
|
|
|
|
|
|
// import 'package:flutter_pickers/more_pickers/route/multiple_picker_route.dart';
|
|
|
|
|
|
// import 'package:flutter_pickers/more_pickers/route/single_picker_route.dart';
|
|
|
|
|
|
// import 'package:flutter_pickers/style/default_style.dart';
|
|
|
|
|
|
// import 'package:flutter_pickers/style/picker_style.dart';
|
|
|
|
|
|
// import 'package:flutter_pickers/time_picker/model/date_mode.dart';
|
|
|
|
|
|
// import 'package:flutter_pickers/time_picker/model/pduration.dart';
|
|
|
|
|
|
// import 'package:flutter_pickers/time_picker/model/suffix.dart';
|
|
|
|
|
|
// import 'package:flutter_pickers/time_picker/route/date_picker_route.dart';
|
|
|
|
|
|
|
2024-04-26 15:38:59 +08:00
|
|
|
|
import '../../app_settings/app_settings.dart';
|
2023-12-14 10:02:52 +08:00
|
|
|
|
import 'time_picker/model/date_item_model.dart';
|
|
|
|
|
|
|
|
|
|
|
|
/// [onChanged] 选择器发生变动
|
|
|
|
|
|
/// [onConfirm] 选择器提交
|
|
|
|
|
|
/// [pickerStyle] 样式
|
|
|
|
|
|
/// [suffix] 后缀
|
|
|
|
|
|
class Pickers {
|
|
|
|
|
|
/// 单列 通用选择器
|
|
|
|
|
|
static void showSinglePicker(BuildContext context,
|
|
|
|
|
|
{required dynamic data,
|
|
|
|
|
|
dynamic selectData,
|
|
|
|
|
|
String? suffix,
|
|
|
|
|
|
PickerStyle? pickerStyle,
|
|
|
|
|
|
SingleCallback? onChanged,
|
|
|
|
|
|
SingleCallback? onConfirm,
|
|
|
|
|
|
Function(bool isCancel)? onCancel,
|
|
|
|
|
|
bool overlapTabBar = false}) {
|
|
|
|
|
|
assert((data is List) || (data is PickerDataType),
|
|
|
|
|
|
'params : data must List or PickerDataType');
|
|
|
|
|
|
|
2024-03-25 15:03:02 +08:00
|
|
|
|
pickerStyle ??= DefaultPickerStyle();
|
|
|
|
|
|
pickerStyle.context ??= context;
|
2023-12-14 10:02:52 +08:00
|
|
|
|
|
|
|
|
|
|
Navigator.of(context, rootNavigator: overlapTabBar).push(SinglePickerRoute(
|
|
|
|
|
|
data: data,
|
|
|
|
|
|
suffix: suffix,
|
|
|
|
|
|
selectData: selectData,
|
|
|
|
|
|
pickerStyle: pickerStyle,
|
|
|
|
|
|
onChanged: onChanged,
|
|
|
|
|
|
onConfirm: onConfirm,
|
|
|
|
|
|
onCancel: onCancel,
|
|
|
|
|
|
// theme: Theme.of(context, shadowThemeOnly: true),
|
|
|
|
|
|
theme: Theme.of(context),
|
|
|
|
|
|
barrierLabel: MaterialLocalizations.of(context).modalBarrierDismissLabel,
|
|
|
|
|
|
));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// 通用 多列选择器
|
|
|
|
|
|
/// 无关联
|
|
|
|
|
|
static void showMultiPicker(BuildContext context,
|
|
|
|
|
|
{required List<List> data,
|
|
|
|
|
|
List? selectData,
|
|
|
|
|
|
List? suffix,
|
|
|
|
|
|
PickerStyle? pickerStyle,
|
|
|
|
|
|
MultipleCallback? onChanged,
|
|
|
|
|
|
MultipleCallback? onConfirm,
|
|
|
|
|
|
Function(bool isCancel)? onCancel,
|
|
|
|
|
|
bool overlapTabBar = false}) {
|
2024-03-25 15:03:02 +08:00
|
|
|
|
selectData ??= [];
|
2023-12-14 10:02:52 +08:00
|
|
|
|
|
2024-03-25 15:03:02 +08:00
|
|
|
|
pickerStyle ??= DefaultPickerStyle();
|
|
|
|
|
|
pickerStyle.context ??= context;
|
2023-12-14 10:02:52 +08:00
|
|
|
|
|
|
|
|
|
|
Navigator.of(context, rootNavigator: overlapTabBar)
|
|
|
|
|
|
.push(MultiplePickerRoute(
|
|
|
|
|
|
data: data,
|
|
|
|
|
|
selectData: selectData,
|
|
|
|
|
|
suffix: suffix,
|
|
|
|
|
|
pickerStyle: pickerStyle,
|
|
|
|
|
|
onChanged: onChanged,
|
|
|
|
|
|
onConfirm: onConfirm,
|
|
|
|
|
|
onCancel: onCancel,
|
|
|
|
|
|
// theme: Theme.of(context, shadowThemeOnly: true),
|
|
|
|
|
|
theme: Theme.of(context),
|
|
|
|
|
|
barrierLabel: MaterialLocalizations.of(context).modalBarrierDismissLabel,
|
|
|
|
|
|
));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// 通用 多列选择器
|
|
|
|
|
|
/// 有关联
|
|
|
|
|
|
/// [columeNum] 最大的列数
|
|
|
|
|
|
static void showMultiLinkPicker(BuildContext context,
|
|
|
|
|
|
{required dynamic data,
|
|
|
|
|
|
required int columeNum,
|
|
|
|
|
|
List? selectData,
|
|
|
|
|
|
List? suffix,
|
|
|
|
|
|
PickerStyle? pickerStyle,
|
|
|
|
|
|
MultipleLinkCallback? onChanged,
|
|
|
|
|
|
MultipleLinkCallback? onConfirm,
|
|
|
|
|
|
Function(bool isCancel)? onCancel,
|
|
|
|
|
|
bool overlapTabBar = false}) {
|
|
|
|
|
|
assert(data is Map, 'params : data must Map');
|
|
|
|
|
|
|
2024-03-25 15:03:02 +08:00
|
|
|
|
selectData ??= [];
|
2023-12-14 10:02:52 +08:00
|
|
|
|
|
2024-03-25 15:03:02 +08:00
|
|
|
|
pickerStyle ??= DefaultPickerStyle();
|
|
|
|
|
|
pickerStyle.context ??= context;
|
2023-12-14 10:02:52 +08:00
|
|
|
|
|
|
|
|
|
|
Navigator.of(context, rootNavigator: overlapTabBar)
|
|
|
|
|
|
.push(MultipleLinkPickerRoute(
|
|
|
|
|
|
data: data,
|
|
|
|
|
|
selectData: selectData,
|
|
|
|
|
|
columeNum: columeNum,
|
|
|
|
|
|
suffix: suffix,
|
|
|
|
|
|
pickerStyle: pickerStyle,
|
|
|
|
|
|
onChanged: onChanged,
|
|
|
|
|
|
onConfirm: onConfirm,
|
|
|
|
|
|
onCancel: onCancel,
|
|
|
|
|
|
// theme: Theme.of(context, shadowThemeOnly: true),
|
|
|
|
|
|
theme: Theme.of(context),
|
|
|
|
|
|
barrierLabel: MaterialLocalizations.of(context).modalBarrierDismissLabel,
|
|
|
|
|
|
));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// 自定义 地区选择器
|
|
|
|
|
|
/// [initProvince] 初始化 省
|
|
|
|
|
|
/// [initCity] 初始化 市
|
|
|
|
|
|
/// [initTown] 初始化 区
|
|
|
|
|
|
/// [onChanged] 选择器发生变动
|
|
|
|
|
|
/// [onConfirm] 选择器提交
|
|
|
|
|
|
/// [addAllItem] 市、区是否添加 '全部' 选项 默认:true
|
|
|
|
|
|
static void showAddressPicker(BuildContext context,
|
|
|
|
|
|
{PickerStyle? pickerStyle,
|
|
|
|
|
|
String initProvince: '',
|
|
|
|
|
|
String initCity: '',
|
|
|
|
|
|
String? initTown,
|
|
|
|
|
|
bool addAllItem: true,
|
|
|
|
|
|
AddressCallback? onChanged,
|
|
|
|
|
|
AddressCallback? onConfirm,
|
|
|
|
|
|
Function(bool isCancel)? onCancel,
|
|
|
|
|
|
bool overlapTabBar = false}) {
|
2024-03-25 15:03:02 +08:00
|
|
|
|
pickerStyle ??= DefaultPickerStyle();
|
|
|
|
|
|
pickerStyle.context ??= context;
|
2023-12-14 10:02:52 +08:00
|
|
|
|
|
|
|
|
|
|
Navigator.of(context, rootNavigator: overlapTabBar).push(AddressPickerRoute(
|
|
|
|
|
|
pickerStyle: pickerStyle,
|
|
|
|
|
|
initProvince: initProvince,
|
|
|
|
|
|
initCity: initCity,
|
|
|
|
|
|
initTown: initTown,
|
|
|
|
|
|
onChanged: onChanged,
|
|
|
|
|
|
onConfirm: onConfirm,
|
|
|
|
|
|
onCancel: onCancel,
|
|
|
|
|
|
addAllItem: addAllItem,
|
|
|
|
|
|
theme: Theme.of(context),
|
|
|
|
|
|
barrierLabel: MaterialLocalizations.of(context).modalBarrierDismissLabel,
|
|
|
|
|
|
));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// 时间选择器
|
|
|
|
|
|
/// [Suffix] : 每列时间对应的单位 默认:中文常规 Suffix(years: '年',month: '月');
|
|
|
|
|
|
/// [selectDate] : 初始化选中时间 默认现在
|
|
|
|
|
|
/// PDuration.now();
|
2024-05-04 13:36:17 +08:00
|
|
|
|
/// PDuration.parse(DateTime.tryParse('20210139'));
|
2023-12-14 10:02:52 +08:00
|
|
|
|
/// PDuration(year: 2020,month: 2);
|
|
|
|
|
|
/// [maxDate] : 最大时间 用法同上
|
|
|
|
|
|
/// tip: 当只有单列数据,该限制不产生关联 只针对单列item限制,比如 maxDate>day = 3 minDate>day = 10,那么所有的月份都只显示3-10之间
|
|
|
|
|
|
/// [minDate] : 最小时间 用法同上
|
|
|
|
|
|
/// [mode] : 时间选择器所显示样式 16 种时间样式 默认:DateMode.YMD
|
|
|
|
|
|
static void showDatePicker(BuildContext context,
|
|
|
|
|
|
{DateMode mode: DateMode.YMD,
|
2024-05-04 13:36:17 +08:00
|
|
|
|
required PDuration? selectDate,
|
2023-12-14 10:02:52 +08:00
|
|
|
|
PDuration? maxDate,
|
|
|
|
|
|
PDuration? minDate,
|
|
|
|
|
|
Suffix? suffix,
|
|
|
|
|
|
PickerStyle? pickerStyle,
|
|
|
|
|
|
DateCallback? onChanged,
|
|
|
|
|
|
DateCallback? onConfirm,
|
|
|
|
|
|
Function(bool isCancel)? onCancel,
|
2024-06-03 13:50:07 +08:00
|
|
|
|
bool overlapTabBar = false,
|
|
|
|
|
|
bool hourShow24 = false}) {
|
2024-03-25 15:03:02 +08:00
|
|
|
|
pickerStyle ??= DefaultPickerStyle();
|
|
|
|
|
|
pickerStyle.context ??= context;
|
2023-12-14 10:02:52 +08:00
|
|
|
|
|
2024-03-25 15:03:02 +08:00
|
|
|
|
selectDate ??= PDuration.now();
|
|
|
|
|
|
suffix ??= Suffix.normal();
|
2023-12-14 10:02:52 +08:00
|
|
|
|
|
|
|
|
|
|
// 解析是否有对应数据
|
|
|
|
|
|
DateItemModel dateItemModel = DateItemModel.parse(mode);
|
|
|
|
|
|
|
2024-03-25 15:03:02 +08:00
|
|
|
|
maxDate ??= PDuration(year: 2100);
|
|
|
|
|
|
minDate ??= PDuration(year: 1900);
|
2023-12-14 10:02:52 +08:00
|
|
|
|
|
|
|
|
|
|
if ((dateItemModel.day || dateItemModel.year)) {
|
|
|
|
|
|
if (intEmpty(selectDate.year)) {
|
2024-04-26 15:38:59 +08:00
|
|
|
|
AppLog.log('picker Tip >>> initDate未设置years,默认设置为now().year');
|
2023-12-14 10:02:52 +08:00
|
|
|
|
selectDate.year = DateTime.now().year;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// 如果有年item ,必须限制
|
|
|
|
|
|
if (intEmpty(maxDate.year)) maxDate.year = 2100;
|
|
|
|
|
|
if (intEmpty(minDate.year)) minDate.year = 1900;
|
|
|
|
|
|
|
2024-04-26 15:38:59 +08:00
|
|
|
|
// AppLog.log('longer >>> ${minDate.year}');
|
2023-12-14 10:02:52 +08:00
|
|
|
|
|
|
|
|
|
|
if (dateItemModel.month || dateItemModel.day) {
|
|
|
|
|
|
assert(minDate.year! > 1582, 'min Date Year must > 1582');
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-06-03 13:50:07 +08:00
|
|
|
|
AppLog.log('picker Tip >>> hourShow24 : $hourShow24');
|
2023-12-14 10:02:52 +08:00
|
|
|
|
Navigator.of(context, rootNavigator: overlapTabBar).push(DatePickerRoute(
|
|
|
|
|
|
mode: mode,
|
|
|
|
|
|
initDate: selectDate,
|
|
|
|
|
|
maxDate: maxDate,
|
|
|
|
|
|
minDate: minDate,
|
|
|
|
|
|
suffix: suffix,
|
|
|
|
|
|
pickerStyle: pickerStyle,
|
|
|
|
|
|
onChanged: onChanged,
|
|
|
|
|
|
onConfirm: onConfirm,
|
|
|
|
|
|
onCancel: onCancel,
|
|
|
|
|
|
// theme: Theme.of(context, shadowThemeOnly: true),
|
|
|
|
|
|
theme: Theme.of(context),
|
|
|
|
|
|
barrierLabel: MaterialLocalizations.of(context).modalBarrierDismissLabel,
|
2024-06-03 13:50:07 +08:00
|
|
|
|
hourShow24: hourShow24,
|
2023-12-14 10:02:52 +08:00
|
|
|
|
));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|