234 lines
8.4 KiB
Dart
Raw Permalink Normal View History

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';
// 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';
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');
pickerStyle ??= DefaultPickerStyle();
pickerStyle.context ??= context;
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}) {
selectData ??= [];
pickerStyle ??= DefaultPickerStyle();
pickerStyle.context ??= context;
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');
selectData ??= [];
pickerStyle ??= DefaultPickerStyle();
pickerStyle.context ??= context;
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}) {
pickerStyle ??= DefaultPickerStyle();
pickerStyle.context ??= context;
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();
/// PDuration.parse(DateTime.tryParse('20210139'));
/// 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,
required PDuration? selectDate,
PDuration? maxDate,
PDuration? minDate,
Suffix? suffix,
PickerStyle? pickerStyle,
DateCallback? onChanged,
DateCallback? onConfirm,
Function(bool isCancel)? onCancel,
bool overlapTabBar = false,
bool hourShow24 = false}) {
pickerStyle ??= DefaultPickerStyle();
pickerStyle.context ??= context;
selectDate ??= PDuration.now();
suffix ??= Suffix.normal();
// 解析是否有对应数据
DateItemModel dateItemModel = DateItemModel.parse(mode);
maxDate ??= PDuration(year: 2100);
minDate ??= PDuration(year: 1900);
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');
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}');
if (dateItemModel.month || dateItemModel.day) {
assert(minDate.year! > 1582, 'min Date Year must > 1582');
}
}
AppLog.log('picker Tip >>> hourShow24 : $hourShow24');
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,
hourShow24: hourShow24,
));
}
}