234 lines
8.4 KiB
Dart
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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';
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)) {
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;
// 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,
));
}
}