themed-time-range-picker
Use ThemedTimeRangePicker in a layrz Flutter widget. Apply when adding a start + end time selection field.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Use ThemedTimeRangePicker in a layrz Flutter widget. Apply when adding a start + end time selection field.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Use ThemedTabView and ThemedTab in a layrz Flutter widget. Apply when adding horizontal tab navigation with Material 3 styling.
Use ThemedButton in a layrz Flutter widget. Apply when rendering any tappable action — primary/secondary CTAs, icon-only FABs, destructive actions, cooldown buttons, or the six semantic factories (.save, .cancel, .info, .show, .edit, .delete).
Use ThemedSearchInput in a layrz Flutter widget. Apply when adding a search bar — either a compact icon button that expands into an overlay, or a full-width inline field.
Use when migrating ThemedTable<T> (v1) to ThemedTable2<T> (v2) in a layrz Flutter widget. Apply when a widget uses the old ThemedTable API with onShow/onEdit/onDelete/onMultiDelete/ThemedColumn and needs to be updated.
Use ResponsiveCol in a layrz Flutter widget. Apply when defining a column's width at different breakpoints inside a ResponsiveRow.
Use ResponsiveRow in a layrz Flutter widget. Apply when wrapping ResponsiveCol children in a responsive 12-column grid container.
| name | themed-time-range-picker |
| description | Use ThemedTimeRangePicker in a layrz Flutter widget. Apply when adding a start + end time selection field. |
Dart syntax: This library requires Dart ≥ 3.10. Use dot shorthand for all enum values — never write the fully-qualified form.
Full constructor and property reference: read
references/api.mdin this skill's directory.
List<TimeOfDay> (empty or exactly 2 elements)showTimePicker — always use this widget.For a single time → use ThemedTimePicker.
ThemedTimeRangePicker(
labelText: context.i18n.t('entity.timeRange'),
value: timeRange,
errors: context.getErrors(key: 'timeRange'),
onChanged: (range) {
timeRange = range;
if (context.mounted) onChanged.call();
},
)
value must be empty or exactly 2 elements — assert enforced.[earliest, latest] — no manual sorting needed.onChanged fires only when the user taps Save and both start and end are set.%I:%M %p). Set use24HourFormat: true for 24-hour (%H:%M)."HH:MM - HH:MM" formatted with pattern.disableBlink: true disables the blink animation in both spinners.customChild wraps any widget in an InkWell that opens the dialog.label / labelText must be set — assert enforced.// 24-hour format
ThemedTimeRangePicker(
labelText: context.i18n.t('shift.operatingHours'),
value: operatingHours,
use24HourFormat: true,
errors: context.getErrors(key: 'operatingHours'),
onChanged: (range) {
operatingHours = range;
if (context.mounted) onChanged.call();
},
)
// Pre-populated range
ThemedTimeRangePicker(
labelText: context.i18n.t('schedule.window'),
value: const [TimeOfDay(hour: 8, minute: 0), TimeOfDay(hour: 17, minute: 0)],
onChanged: (range) {
selectedRange = range;
if (context.mounted) onChanged.call();
},
)
// Disabled
ThemedTimeRangePicker(
labelText: context.i18n.t('entity.timeRange'),
value: timeRange,
disabled: true,
)
onChanged with if (context.mounted) before calling the parent callback.context.i18n.t('entity.fieldName') for labelText — never hardcode strings.errors: context.getErrors(key: 'fieldName').value — the assert will throw.const SizedBox(height: 10).