junny_form 0.0.48 copy "junny_form: ^0.0.48" to clipboard
junny_form: ^0.0.48 copied to clipboard

A flexible Flutter form management library that supports centralized field management, async validation, and custom field types.

Changelog #

2026-03-04 - v0.0.48 #

  • 🐛 修复:表单校验重复触发并跳过禁用字段
    • 修复表单校验在某些场景下重复触发的问题
    • 校验时自动跳过禁用字段,避免对不可编辑字段进行无效校验
  • 🐛 修复:筛选回调返回可修改 Map 副本
    • 筛选回调(onConfirm/onReset 等)现在返回可修改的 Map 副本
    • 允许业务侧在回调中安全地修改数据而不影响原始状态
  • 🔖 版本
    • 升级版本至 0.0.48

2026-03-03 - v0.0.47 #

  • 新增:onValueChangedWithController 回调支持
    • 新增 JunnyOnValueChangedWithController<T> typedef,支持在值变化回调中直接访问 JunnyFormController
    • 适用于 FilterBar 等需要在值变化后联动写入其他字段的场景,避免业务侧做"曲线救国"处理
    • 当配置了 onValueChangedWithController 时,框架优先执行该回调并忽略旧的 onValueChanged,避免重复操作
    • 更新 copyWith 方法支持新字段
  • 🐛 修复:FilterSearchBar 文本同步问题
    • 改进 Consumer builder 中的 expectedTextcontroller.value 同步机制
    • 移除 onSubmitted 回调中未使用的参数,保持代码简洁
  • 🔖 版本
    • 升级版本至 0.0.47

2026-01-16 - v0.0.46 #

  • 🐛 修复:字段初始化与 FilterBar 空值判定问题
    • 初始化流程优化:将 initState 中的值对齐和联动触发分离到 didChangeDependencies,避免在 initState 阶段访问 Localizations/Theme 等 InheritedWidget 导致的断言错误
    • FilterBar 激活项判定优化:优先使用字段的 isEmptyForDecorator 判断是否为空,支持 State dispose 后的降级判断(JunnyDateTimeRangeJunnyNumRangeDataMap<String, dynamic>
    • 新增 _parseSelectionDisplayKeys:从 SelectionField 的 effectiveName 解析 shouldDisplayKeys,提升筛选栏对 Map 类型字段的空值判定准确性
  • 新增:字段名称计算优化
    • 新增 effectiveName getter:在 Widget 层面提供字段最终使用的 name,支持 FilterBar 等场景在 State 未创建时获取字段名
    • 动态字段名生成
      • JunnyNumRangeField:根据 from/to 字段名动态生成(最长公共前缀 + 'NumRange')
      • JunnyDateTimeRangeField:根据 start/end 字段名动态生成(最长公共前缀 + 'Range')
      • JunnySingleSelectionField:根据 valueMapper 动态生成(格式:selection_{shouldDisplayKeys}_hashCode
      • JunnyAddressField:建议显式配置 name(因计算依赖 context)
    • 简化 State 中的 name getter:优先使用 Widget 的 effectiveName,消除逻辑重复
  • 🐛 修复:日期时间范围选择边界问题
    • 单日选择修复:仅选择起点时自动补齐 end 为同一天 23:59:59.999
    • 统一日期归一化:start 归一到 00:00:00.000,end 归一到 23:59:59.999
    • 添加毫秒支持:便于"整天区间"的闭区间表达
  • 📚 模型增强
    • 新增 JunnyDateTimeRange.isEmpty:检查时间范围是否为空(起始和结束时间都为空)
  • 🔖 版本
    • 升级版本至 0.0.46

2026-01-08 - v0.0.45 #

  • 🐛 修复:DictEnumField 在 FilterIndicator 中展示错误
    • 修复 DictEnumField 字段在 FilterIndicator 中展示 dataCode 而非 dataName 的问题
    • 问题根因是时序问题:FilterBar 初始化时 confirmAllDisplayText() 在 dict 异步加载之前执行
    • 修复方案:在 _initData() 完成后补充 dictValue 并同步 displayText 缓存到 confirmed 缓存
  • 🔖 版本
    • 升级版本至 0.0.45

2026-01-07 - v0.0.44 #

  • 新增:时间组件格式配置支持
    • 修复时间组件格式配置被忽略的问题,确保自定义格式正确生效
  • 🐛 修复:筛选栏数据同步问题
    • 修复筛选栏数据同步与初始值优先级问题,确保初始值正确加载
  • ♻️ 重构:时间格式化配置
    • 抽取时间格式化配置为 Mixin 并统一默认格式,提升代码复用性
  • 📚 文档
    • 初始化 OpenSpec 规范驱动开发框架及 AI 助手配置
    • 补充 Filter 重建机制说明及异步数据注意事项
  • 🔖 版本
    • 升级版本至 0.0.44

2025-12-05 - v0.0.43 #

  • 新增:表单控制作用域
    • 新增 JunnyFormControlScope InheritedWidget,向下传递字段必填/禁用控制,解耦逻辑与 UI。
    • core.dart 导出 Scope,便于外部直接引入。
  • ♻️ 行为调整:只读/必填判定可空化
    • JunnyFormFieldStatusConfig.readOnlyGetterJunnyFormFieldValidatorConfig.requiredGetter 变为可空,改为“组件配置优先,其次 Scope,默认 false”。
    • JunnyFormFieldState 的必填标记与校验统一使用上述判定顺序。
  • 🔖 版本
    • 升级版本至 0.0.43

2025-12-04 - v0.0.42 #

  • 🐛 修复:子表计算模式切换失效问题
    • 修复 list_page.dart 中 Selector 监听缺失导致 UI 不重建的问题
    • 修复 subtable_field.dart 中缓存未清理导致计算模式切换后数据不刷新的问题
  • 🎨 优化:子表计算模式切换按钮 UI
    • 统一按钮图标为 Icons.swap_horiz (size 18)
    • 强制左对齐布局,与下方操作项对齐
    • 统一使用主题色适配
  • 🔖 版本
    • 升级版本至 0.0.42

2025-11-24 - v0.0.41 #

  • 🐛 Map 单选判空与回显一致:JunnyMapSelectionMixin 的空判定改为基于 echoKeys/shouldDisplay,当展示字段全空时视为未选,避免仅因 mapper 里其他字段有值导致必填校验误通过、UI 却显示 hint。
  • 🔖 版本
    • 升级版本至 0.0.41

2025-11-21 - v0.0.40 #

  • ♻️ choice 参数收敛:分 Map/非 Map 使用
    • JunnyFormChoiceParams<T> 保留非 Map 场景,无需 valueMapper/echoKeys
    • 新增 JunnyFormMapChoiceParams(继承 JunnyFormMapSelectionParams):强制 valueMapper,可选 echoKeys 控制初始“已选”判定仅参考指定键,避免仅有联动字段时误判为已选。
    • 引入 ChoiceParamsBase 复用 dataGetter/disabledWhen/hiddenWhen/choiceTitleBuilder,map 选择仍可写联动字段,初始回显按 echoKeys 判定。
  • 📚 文档
    • docs/FORM_COMPONENTS_GUIDE.md Choice 章节补充 Map/非 Map 用法与 echoKeys 示例。
  • 🔖 版本
    • 升级版本至 0.0.40

2025-11-17 - v0.0.39 #

  • ✨ dayPeriod 半程配置能力
    • JunnyFormDateTimeRangeParams 新增 dayPeriodConfig 字段,可通过参数层统一配置“上/下半程”的时间区间与展示文案(如早班/晚班、上半天/下半天),并在字段间复用。
    • JunnyDateTimeRangeFieldTimePickerMode.dayPeriod 模式下接入 DayPeriodConfig
      • 选择结果写回表单值时,使用配置计算真实起止时间点(起点取半程起始、终点取半程结束的最后一秒),更贴合考勤/排班等业务场景;
      • 展示层支持自定义半程文案,当配置带有 labelGetter 时,跨天或跨半程区间显示为「日期 + 半程时间段」,同一天同一半程时开始/结束字段分别展示各自具体时间。
    • 默认行为保持兼容:未显式传入 dayPeriodConfig 时,沿用原先基于 Material DayPeriod 的 AM/PM 语义与展示。
  • 🔖 版本
    • 升级版本至 0.0.39

2025-11-14 - v0.0.38 #

  • 🐛 修复:日期时间范围字段清除逻辑
    • 修正 JunnyDateTimeRangeField 在存在预设 start/end 值时,清除按钮被初始化保护逻辑拦截的问题。
    • 引入用户清除标记 _isUserClearing,区分“初始化/重置产生的 null”和“用户主动清除产生的 null”,确保点击清除能正确置空关联字段。
    • 保持原有从 vacationStart/vacationEnd 等预设字段反向构建区间值的行为不变。
  • 🔖 版本
    • 升级版本至 0.0.38

2025-11-12 - v0.0.37 #

  • ✨ 筛选-模式二(可选精准/模糊)
    • 新增分裂按钮:支持“精准搜索/模糊搜索”选择;默认使用 filterDefaultSearchMode,页面内记忆上次选择。
    • 仅 Input 组件(JunnyInputFieldState)参与模式二的 dynamicParams 组装;其他类型保持顶层字段。
    • 模式二 + FilterReturnPolicy.dynamicClean:迁移到 dynamicParams 的键将从返回 Map 中删除(非置空)。
    • 支持回调保留顶层键:keepTopLevelKeyPredicate(局部优先,全局可配 filterKeepTopLevelKeyPredicate)。
    • 搜索模式文案国际化:新增 searchModeTextBuilder,未配置时回退中文。
    • FilterBar 透传上述参数至弹窗;不启用分裂按钮时,保持模式一单按钮与原数据结构。
  • 🔧 代码
    • 新增:lib/src/enums/search_mode.dartSearchModeFilterReturnPolicy)。
    • 修改:lib/src/configs/global_config.dart(新增默认项与 i18n 回调)。
    • 修改:lib/src/filter/dialog.dart(分裂按钮、转换逻辑、回调与国际化)。
    • 修改:lib/src/filter/bar.dart(页面内记忆上次选择,参数透传)。
  • 🧹 Lint
    • 修复导入顺序、弃用 API(withOpacitywithValuesdescribeEnumname)、冗余参数等;dart analyze 通过。

2025-11-11 - v0.0.36 #

  • ✨ 特例化:只读空值 hint 恢复显示(附件/子表)
    • 新增受保护开关 showHintInReadOnly(默认 false),用于“只读仍可跳转”的特殊组件在只读且无值时,继续通过父级 InputDecorator 渲染空态文案(如“暂无数据”)。
    • 附件与子表组件开启该开关:只读时仍可点击跳转,且在无值时显示“暂无数据”。
    • 保持全局策略一致:除上述特例外,其他字段在只读模式下仍隐藏 hint。
  • 🔧 代码
    • core/form_field.dart:新增 showHintInReadOnly 钩子并调整 hint 判据。
    • selection/single/attachment_field.dart、subtable/subtable_field.dart:覆写开关。
  • 🔖 版本
    • 升级版本至 0.0.36

2025-11-10 - v0.0.35 #

  • 🐛 修复:选择类与自定义组件的 hintText 显示规则
    • 将装饰合成阶段的 hintText 显示判据从 parentDecorationEnabled 调整为以 readOnly 为唯一判据:
      • readOnly == true:隐藏 hint(仅查看模式,仅展示 value)。
      • readOnly == false:允许展示 hint(无论 enabled 是否为 false)。
    • 交互与点击判据不变:是否可点仍由 parentDecorationEnabled 控制。
    • 影响范围:选择类(time/dict/selection 等)与 JunnyWidgetField 自定义组件的 hint 显示一致符合业务语义。
  • 🔧 代码
    • core/form_field.dart:_applyCustomDecorations 调整 hintText 显示判据。
  • 🔖 版本
    • 升级版本至 0.0.35

2025-10-13 - v0.0.34 #

  • ♻️ 核心与状态优化
    • 将 didUpdateWidget 调整为 setFormStateValue 静默对齐 + controller.updateValue,避免重建期重复联动;setValue 注释澄清(保留原有拦截+联动语义)。
    • 全面引入等价性短路与同步守护:selection 等价跳过、chips 支持 equalsIgnoreOrder、dict code/value 写回前等价校验、map_selection_mixin 逐键等价短路、input 文本回填 _syncing 标志与 didUpdate/restore 等价短路。
    • 保持对外语义不变。
  • ✨ 选择类“虚拟焦点维持”默认开启(全局可控)
    • 新增全局默认 JunnyFormGlobalConfig.maintainVirtualFocusDuringSelectDefault(默认 true),字段级 extraParams.maintainVirtualFocusDuringSelect 优先。
    • 已应用于 selection/dict/chips/address/attachment/time(包含 date/time/date_time_range/month/quarter/year/week 等)。
  • ✨ 时间类性能:可选格式化缓存
    • 按字段 params 引入 enableFormatCache(默认 false)。
    • date/time/date_time_range 接入 DateFormatCache(key=scope|locale|pattern),降低格式化对象构建开销,保持默认语义不变。
  • ♻️ 子表交互优化
    • 子表行级操作与图标交互体验优化。
  • ⚡ 性能优化(subtable)
    • 优化列表页重建范围与构建开销,移除调试日志。
  • 🧭 文档
    • 完善 maintainVirtualFocusDuringSelect 参数说明,引用全局默认配置。
    • 新增/重构组件报告结构(按目录划分 + configs 专题 + 数据流总览),补充覆盖率审计。
  • 🔖 版本
    • 升级版本至 0.0.34

2025-09-17 - v0.0.33 #

  • 🐛 修复:附件字段初始同步导致现有数据被清空的问题
    • 新增 _initialSyncCompleted 标记,避免初次生命周期将控制器中已有附件移除
    • 初次同步时保留 attachments 字段与 formController 中的原始数据
    • 确保 JunnyAttachmentFieldState 清除逻辑仅在确认为空时执行
  • 🔖 版本
    • 升级版本至 0.0.33

2025-09-02 - v0.0.32 #

  • 新增:类型安全的字段状态获取扩展
    • 新增 JunnyFormControllerFieldStateExtensions 扩展类
    • 提供10+个专用字段状态获取方法:getSelectionFieldStategetInputFieldStategetChipsFieldState
    • 支持类型安全的字段状态访问,避免手动类型转换的复杂性和潜在错误
    • 完善的文档注释和使用示例,提升开发体验
  • 🔧 API优化:FormController方法重构
    • 重命名方法:getFieldStategetOriginalFieldState
    • 优化方法文档注释,提供更清晰的参数说明
    • 改进类型安全性和参数格式化
  • 🐛 修复:组件禁用状态显示问题
    • 修复 JunnyDictFieldState 文本颜色逻辑:从只检查 readOnly 改为检查 !enabled || readOnly
    • 修复 JunnySelectionFieldState 文本颜色逻辑:从只检查 readOnly 改为检查 !enabled || readOnly
    • 修复 JunnyDateTimeRangeField 文本颜色逻辑:从只检查 readOnly 改为检查 !enabled || readOnly
    • 确保禁用状态下的文本正确显示为灰色
  • 🛠️ 代码质量提升
    • 优化代码格式化,统一代码风格
    • 移除多余的空行,提升代码整洁度
    • 完善类型注解和文档注释
  • 🔖 版本
    • 升级版本至 0.0.32

2025-08-29 - v0.0.31 #

  • 🔄 API重构:参数配置优化
    • 移除所有选择类参数中的 formatter 参数,统一迁移至 statusConfig.formatter
    • 优化 JunnyFormSelectionParams 及其子类的API设计,简化参数配置
    • 更新文档注释,将示例中的 .build() 改为 .toMap()
    • 涉及组件:附件、选择、日期、月份、季度、时间、周、年份等所有选择类字段
  • 🛠️ 组件优化:子表字段异常处理增强
    • 优化 JunnySubtableFieldState 中验证器构建时的异常处理逻辑
    • 使用 firstWhereOrNull 替代 firstWhere,避免未找到条目时的异常
    • 增强标题获取的容错性,提供多层级的备用方案
    • 提升组件在边界情况下的稳定性
  • 月份字段功能增强
    • JunnyMonthField 新增默认格式化器,自动显示为年月格式
    • 新增 _parseValueDate 方法,支持多种日期格式的智能解析
    • 优化日期选择和保存逻辑,提升用户体验
    • 支持完整日期时间格式和年月格式的双向兼容
  • 🔖 版本
    • 升级版本至 0.0.31

2025-08-28 - v0.0.30 #

  • 🎨 代码质量优化:子表组件异常处理改进
    • 优化 JunnySubtableFieldState 中验证器构建时的异常处理逻辑
    • 当获取标题失败时,使用 info.titleBuilder(null) 而不是 entry.key 作为备用方案
    • 提升代码健壮性,避免在初始化阶段出现异常
  • 日期时间范围组件国际化增强
    • JunnyDateTimeRangeField 新增默认标题支持
    • 使用 MaterialLocalizations.unspecifiedDateRange 提供国际化的默认标题
    • 优化提示文本,使用 MaterialLocalizations.dateRangePickerHelpText 替代自定义提示
    • 提升组件的国际化支持和用户体验
  • 🎨 代码格式化优化
    • 统一代码格式,优化换行和缩进风格
    • 提升代码可读性和维护性
  • 🔖 版本
    • 升级版本至 0.0.30

2025-08-26 - v0.0.29 #

  • 🐛 修复日期时间范围组件初始化数据清空问题
    • 修复 JunnyDateTimeRangeField 组件在初始化时预设数据被意外清空的问题
    • onValueChanged 方法中添加初始化保护逻辑,防止 null 值覆盖预设的 start/end 数据
    • 解决了 formController.patchValue({start: 'xxx', end: 'xxx'}) 在组件初始化时被清空的问题
    • 保持组件所有正常功能不受影响,向后兼容
  • 🎨 筛选组件样式优化
    • 优化 FilterIndicator 组件的布局和样式
    • 为容器添加左对齐和内边距,提升视觉效果
    • 优化空状态提示文本的样式,使用禁用颜色显示
  • 📁 文档结构调整
    • CHANGELOG_v3_attachment.md 移动到 docs/ 目录下
  • 🧪 测试功能增强
    • 在日期时间范围示例页面中添加"测试预设数据"按钮,方便验证修复效果
  • 🔖 版本
    • 升级版本至 0.0.29

2025-08-25 - v0.0.28 #

  • 🔄 API适配:Flutter SDK 3.35.1 兼容性更新
    • 修复 JunnyFormFieldState._getEditableArrowIndicatorColorInputDecorationTheme 类型变更问题
    • 修复 JunnyFormFieldStatusConfiginterceptValueChange 参数赋值逻辑
    • 更新示例页面忽略规则,兼容 SDK 新增的弃用警告
  • 🔧 依赖升级
    • 升级 junny_utils 依赖至 ^0.0.5
  • 🔖 版本
    • 升级版本至 0.0.28

2025-08-16 - v0.0.27 #

  • ✨ 子表控制器状态同步完善
    • JunnySubtableFieldState.buildContent() 构建时同步 enabled/readOnly 到控制器(仅变更时通知),外部可只读获取 enabledreadOnlyeffectiveEnabled
    • 将交互状态设置的外部入口移除,改为 @internal syncInteractionState,保证状态仅由字段组件决定
  • ✨ 控制器持有字段元信息
    • 通过构造函数注入 fieldNamefieldTitle,对外只读暴露,移除运行期同步接口
  • 🎯 列表页交互一致性
    • list_page.dart 中操作菜单的 actions 仅在 controller.effectiveEnabled 时显示
  • 🧹 代码清理
    • 去除无用的 import 'package:flutter/cupertino.dart'
    • meta 依赖以注释说明并抑制 lint:// ignore: depend_on_referenced_packages
  • 🔖 版本
    • 升级版本至 0.0.27

2025-08-11 - v0.0.26 #

  • ✨ 选择组件清除前拦截与异步清理支持
    • FormFieldState.onClearTap() 方法改为 FutureOr<void> 以支持异步操作(向后兼容)
    • 在地址、附件、字典和通用选择组件中实现 shouldInterceptSelect 拦截器
    • 拦截器可在清除操作前执行自定义逻辑,返回 true 可阻止清除;异常时有兜底,仍执行默认清除
  • 📝 使用提示与文档补充
    • JunnyMapSelectionMixin 中补充选择字段"被动更新"的限制说明:仅刷新显示名时不会触发联动,可能导致展示不准确
    • 推荐做法:显式获取目标字段的 FieldState 年调用 updateValue() 以触发联动刷新

2025-08-11 - v0.0.25 #

  • ✨ 选择组件全面支持虚拟焦点(Virtual Focus)保持 • 在以下参数类中新增 maintainVirtualFocusDuringSelect(默认 false,向后兼容): JunnyFormChipsParamsJunnyFormDictChipsParamsJunnyFormAddressParamsJunnyFormDictParamsJunnyFormDictDataParamsJunnyFormDictEnumParams • 同步完善构造函数、copyWithtoMapfromMap==/hashCode/toString
  • 🔧 交互流程统一虚拟焦点封装 • JunnySelectionFieldState._showPicker() 统一接入虚拟焦点: 当启用时使用 formController.runWithVirtualFocusAsync(name, runSelectionFlow) • 自定义选择流程组件完成适配: JunnyDictChipsFieldState.showPickerJunnyAddressFieldState.showPickerJunnyDictFieldState._showPickerJunnyChipsFieldState.showPicker
  • 🧹 代码细节优化 • 使用 extraParams.parse<bool?>('maintainVirtualFocusDuringSelect') 统一获取扩展参数 • 将 runWithVirtualFocusAsync 的回调由匿名 async 闭包简化为直接传递 runSelectionFlow
  • ✅ 兼容性 • 采用可选参数,默认关闭;未改动调用方即保持原有行为 • 基类统一封装,其他仅依赖 onSelect() 的选择组件可自动获益

2025-08-09 - v0.0.24 #

  • ✨ 功能增强:虚拟焦点(Virtual Focus)机制
    • 新增在 JunnyFormController 中的虚拟焦点支持,解决子表在列表编辑页时 hasFieldFocus 失效的问题
    • hasFieldFocus(key) 现会优先识别虚拟焦点,确保编辑会话期间的联动计算与汇总逻辑生效
    • JunnySubtableFieldState._onNavigateToSubtable() 进入列表页时开始虚拟焦点,会话结束(路由返回)时关闭
  • ✨ 便捷方法:一次性开启/关闭虚拟焦点
    • 单字段:beginVirtualFocus(key) / endVirtualFocus(key)
    • 多字段:beginVirtualFocusMany(keys) / endVirtualFocusMany(keys)
  • ✨ 执行器:在一次程序化更新期间自动托管虚拟焦点
    • 同步:runWithVirtualFocus(key, action)runWithVirtualFocusMany(keys, action)
    • 异步:runWithVirtualFocusAsync(key, action)runWithVirtualFocusManyAsync(keys, action)
  • ✅ 兼容性与收益
    • 无需修改调用方判断逻辑(仍可用 hasFieldFocus 作为优化与防抖门闸)
    • 列表页期间编辑的增删改保存会被视为"有焦点",回到主表后的初始化/接口回填默认不触发
    • 如需让"回到主表后的某一次程序化更新"也被视作编辑会话,可用上述执行器在精确点包裹

2025-08-07 - v0.0.23 #

  • 🔧 API优化:子表组件listPageBuilder参数简化
    • 🎯 参数签名优化 • 移除冗余的 tableCode 参数,可通过 controller.tableCode 获取 • 调整参数顺序:(context, controller, actionsBuilder, enabled) • 将 controller 参数提前,作为最重要的核心参数
    • 功能增强 • 为 JunnySubtableListPage 添加 title 参数传递 • 支持列表页面标题显示,提升用户体验 • 保持所有现有功能完整性
    • 🏗️ API设计改进 • 减少参数冗余,提高接口简洁性 • 更符合面向对象设计原则,通过controller访问相关属性 • 参数顺序更合理,重要参数在前,提升开发体验
    • ⚠️ Breaking Changes影响范围: 仅影响使用了 listPageBuilder 的现有代码 • 迁移指南:
      • 移除 tableCode 参数,使用 controller.tableCode 替代
      • 调整参数顺序:将 controller 移到第二位
      • 示例:(context, controller, actionsBuilder, enabled) => Widget影响评估: 轻微Breaking Change,listPageBuilder 是可选的高级功能
    • 🔄 向前兼容策略 • 不使用 listPageBuilder 的代码完全不受影响 • 使用默认列表页面的功能保持完全兼容 • 迁移成本低,只需调整函数签名即可

2025-08-07 - v0.0.22 #

  • 🎨 用户体验优化:选择类组件只读模式下的hintText显示逻辑
    • 🎯 智能提示文本机制 • 选择类组件在只读模式下显示"暂无数据"而不是"请选择"提示 • 通过readOnly状态判断,自动切换使用emptyDataBuilder或pleaseSelectHintBuilder • 提升只读模式下的用户体验,提示文本更符合实际状态
    • 🔧 空值显示逻辑修复 • 修复JunnySelectionFieldState.buildContent方法中空值时hintText不显示的问题 • 当formatValue返回null时返回SizedBox.shrink(),让InputDecorator正确处理hintText • 修复JunnySubtableField组件空值时的显示逻辑,确保hintText正确显示
    • 📊 影响组件范围地址选择: JunnyAddressField • 标签多选: JunnyChipsField • 字典选择: JunnyDictField系列组件 • 选择基类: JunnySelectionFieldState及其所有子类 • 子表组件: JunnySubtableField • 日期范围: JunnyDateTimeRangeField
    • 🏗️ 代码质量提升 • 统一选择类组件的注释风格,从具体组件名改为"选择类组件使用" • 优化代码结构,将formatValue方法归类到UI相关方法区域 • 保持完全向后兼容性,不影响现有功能和API
    • 技术实现 • 在getDefaultHintText方法中添加readOnly状态判断逻辑 • 使用条件表达式:readOnly ? emptyDataBuilder : pleaseSelectHintBuilder • 确保所有选择类组件行为一致,提升整体用户体验

2025-08-06 - v0.0.21 #

  • 🔧 修复:ChipsTapParams 泛型类型定义优化
    • 🎯 类型安全增强 • 优化 ChipsTapParams 的泛型约束,确保类型参数继承自 Object • 修复 AttachmentTapParams 的类型继承关系,确保类型一致性 • 提升代码的类型安全性和编译时检查
    • 🛠️ 代码质量提升 • 优化泛型类型定义,确保所有选择器参数类遵循统一的类型规范 • 保持完全向后兼容性,不影响现有代码使用 • 提升IDE的类型推断和代码提示体验

2025-07-26 - v0.0.20 #

  • 🐛 修复:选择组件name生成逻辑的翻译稳定性问题
    • 🎯 核心问题解决 • 修复选择组件的name依赖title字段导致翻译加载前后name不稳定的问题 • 翻译前:title = 翻译key(如 'framework_contractRegChange_partyBUserName') • 翻译后:title = 翻译文本(如 '乙方单位名称') • 导致同一组件在不同时间点的name不一致,引发表单数据管理问题
    • 🔧 技术解决方案 • 使用widget的identityHashCode替代依赖翻译的title生成name • identityHashCode基于内存地址,在对象生命周期内保持不变 • 每个widget实例都有不同的identityHashCode,确保绝对唯一性 • 完全避免翻译系统依赖,解决同页面多组件冲突问题
    • 技术优势 • ✅ 绝对唯一:每个widget实例都有不同的内存地址 • ✅ 生命周期稳定:在widget生命周期内identityHashCode不变 • ✅ 完全避免翻译依赖:不涉及title或翻译系统 • ✅ 解决同页面冲突:不同widget实例必然有不同的identityHashCode • ✅ 代码简洁:只有一行核心逻辑,易于理解和维护 • ✅ 性能优异:identityHashCode是O(1)操作
    • 📊 影响范围直接修复: JunnySelectionFieldState基类 • 自动受益: JunnyChoiceField、JunnySingleSelectionField、JunnyAttachmentField等所有继承选择基类的组件 • 完全兼容: 不影响现有用户代码
  • 功能增强:title字段迁移到titleBuilder以支持动态翻译
    • 🎯 API升级 • JunnyFormFieldBasicConfig.title → titleBuilder • JunnySubtableItemInfo.title → titleBuilder • 支持动态翻译和国际化,标题可以根据上下文实时更新 • 提供更灵活的标题构建机制
    • 🐛 关键问题修复 • 修复titleBuilder在initState中调用导致的Provider生命周期错误 • 修复hintText显示翻译key而非翻译内容的问题 • 修复语言切换时标题不更新的问题
    • 🔧 技术实现 • 在inputDecoration getter中动态获取hintText • 添加安全的titleBuilder调用机制 • 实现翻译状态变化时的自动刷新
    • ⚠️ Breaking Changes • title字段已移除,需要使用titleBuilder替代 • 更新所有示例页面使用titleBuilder • 添加API迁移指南文档
  • 🔖 版本
    • 升级版本至 0.0.20

2025-07-22 - v0.0.19 #

  • 🔧 重要修复:表单字段死循环问题彻底解决
    • 🎯 智能值变化检测机制 • 在 JunnyFormFieldState 中实现完整的循环调用防护系统 • 新增 _isExecutingOnValueChanged_isFromListener 状态标识 • 添加 needsInternalSync 虚方法,支持组件自定义同步需求判断 • 通过 DeepCollectionEquality 进行精确的值比较,避免无效触发
    • 🛡️ 高风险组件全面适配 • 为所有重写了 onValueChanged 的组件实现 needsInternalSync 方法 • 包括 JunnyChipsField、JunnyNumRangeField、JunnyDateTimeRangeField、JunnyAttachmentField、JunnySubtableField • 确保内部状态同步需求得到满足,同时防止循环调用
    • 区间组件反向同步机制 • 为 JunnyNumRangeField 和 JunnyDateTimeRangeField 添加反向同步功能 • 支持从 from/to、start/end 字段自动构建主字段值,解决默认值显示问题 • 添加防护机制避免反向同步时的循环调用
    • 🧪 完整测试验证体系 • 在 combined_example_page.dart 中实现高风险组件测试套件 • 添加详细的标签化调试日志系统,便于追踪各组件行为变化 • 实现 _runComprehensiveValueChangeTest 自动化测试方法 • 分别测试相同值重复设置和不同值变化场景
  • 新功能:OriginalValueIndicator 字段状态控制
    • 🎯 可选状态控制功能 • 新增 respectFieldStatus 参数(默认 false,保持向后兼容性) • 支持根据字段的 enable 和 readOnly 状态自动控制显示/隐藏 • 字段禁用时自动隐藏指示器,只读时仍显示(用户可查看值变化历史)
    • 🔧 实时状态检测机制 • 使用 context.findAncestorStateOfType() 直接查找父字段状态 • 避免依赖 JunnyFormController 的注册机制,解决时序问题 • 通过实时状态检测+缓存机制确保状态的准确性
    • 🛠️ 控制器状态修复 • 修复字段重建时控制器状态丢失的问题 • 在 getFieldController 时传入当前表单值作为 initialValue • 确保新控制器具有正确的初始状态
  • 🎨 装饰器交互控制优化
    • 🔧 分层交互控制架构parentDecorationEnabled 控制选择器点击交互(enabled && !readOnly) • InputDecoration.enabled 控制装饰器元素交互(只检查 enabled) • TextField.ignorePointers 控制输入框指针事件(!enabled)
    • 🎯 只读状态交互修复 • 修复输入框组件只读状态下 suffixIcon 无法交互的问题 • 修复选择类组件只读状态下装饰器元素无法交互的问题 • 实现精确的分层控制:只读时禁用选择器但保持装饰器可交互
  • 性能优化
    • 🔧 JunnyNumRangeField 组件优化 • 移除冗余的 Consumer 包装,减少 25% 的 widget 开销 • 直接使用监听器机制确保关联字段变化被正确捕获 • 移除不必要的 setState 调用,优化渲染性能
  • 🏗️ 架构优化:统一表单字段值显示逻辑
    • 🎯 核心架构改进 • 在 JunnyFormFieldState 基类中新增 formatValue 虚方法 • 建立统一的值显示接口,支持 formatter 优先级控制 • displayText 默认调用 formatValue,保持完全向后兼容
    • 🧹 代码重构优化 • 删除 JunnyInputFieldStateJunnySelectionFieldState 中的冗余 formatValue 实现 • 删除多个组件中冗余的 displayText 重写,减少约 50 行冗余代码 • 统一区间组件的代码风格,使用简洁的数组拼接方式
    • 🔧 组件功能增强JunnySubtableField: 新增 formatValue,复用 subtableLengthBuilder 逻辑 • JunnyNumRangeField: 新增 formatValue,复用区间格式化逻辑 • JunnyDateTimeRangeField: 新增 formatValue,复用时间区间格式化 • JunnyDictFieldState: 重写 formatValue,使用字典特有的显示逻辑
    • 📊 架构效果 • 所有表单字段组件现在都有统一的值显示框架 • 提升代码维护性和扩展性,为后续功能扩展提供良好基础 • 保持完全向后兼容,现有功能和 API 不受影响
  • 📚 代码关系图谱建立
    • 🏷️ 完整标签体系 • 为所有核心文件添加功能标签:type、category、role、complexity 等 • 建立清晰的组件分类和功能标识体系
    • 🔗 依赖关系网络 • 建立组件间的完整依赖关系图谱 • 添加详细的功能说明和使用指南注释 • 通过查询工具验证关系建立的正确性
  • 🔖 版本
    • 升级版本至 0.0.19

2025-07-09 - v0.0.18 #

  • 🚀 重构:附件字段数据同步逻辑统一优化
    • 🔧 统一数据同步策略 • 创建 _syncData() 统一数据同步入口,支持双向同步(字段 ↔ attachments.{fieldName}) • 内联整合 _updateAttachmentsToFormData() 逻辑,消除代码重复 • 重写 didChange()onValueChanged() 等核心方法,使用统一同步接口 • 添加 preventLoop 参数防止循环调用,确保数据同步的可靠性
    • 🎯 解决关键问题 • 修复 FormKeyValueTransformer 场景下的 UI 更新问题 • 解决设计理念冲突(数据清空 vs 数据同步) • 消除循环调用风险和逻辑重复问题 • 统一空值处理和错误处理逻辑
    • 性能显著提升 • 减少方法调用层级 66%(从 3 层减少到 1 层) • 消除 100% 的数据同步代码重复 • 减少 50% 的同步方法数量 • 提高缓存命中率和内存使用效率
    • 📊 架构优化 • 统一数据流向:任何数据更新 → _syncData() → 条件判断 → 双向同步 → UI更新 • 简化调用链:所有同步逻辑集中到单一方法 • 增强可靠性:覆盖所有数据变化场景,确保数据一致性 • 优化监听器机制:双重监听器设计确保数据变化的完整捕获
  • 🔖 版本
    • 升级版本至 0.0.18

2025-07-05 - v0.0.17 #

  • 新增:子表保存按钮文本自定义功能
    • 🔧 全局配置增强 • 在 JunnyFormGlobalConfig 中新增 subtableSaveButtonTextBuilder 字段 • 支持全局配置子表列表页面保存按钮的默认文本 • 提供国际化支持,可根据上下文动态构建按钮文本
    • 🎯 子表参数扩展 • 在 JunnyFormSubtableParams 中新增 saveButtonTextBuilder 字段 • 支持在具体子表实例中覆盖全局配置 • 提供更精细的按钮文本控制能力
    • 🔧 层级配置实现 • 在 JunnySubtableListPage 中实现三级配置优先级 • 优先级:subtableParams.saveButtonTextBuilder > globalConfig.subtableSaveButtonTextBuilder > MaterialLocalizations.saveButtonLabel • 确保在任何情况下都有合适的按钮文本显示
    • 🎨 用户体验优化 • 支持业务层面自定义保存按钮文本(如"确定"、"完成"等) • 保持向后兼容性,默认使用系统标准的保存按钮文本 • 优化底部按钮栏的内边距设计,提升视觉效果
  • 🔖 版本
    • 升级版本至 0.0.17

2025-07-03 - v0.0.16 #

  • 🐛 修复:表单字段值变化监听的时序问题
    • 🔧 核心逻辑优化 • 调整 _onValueChanged 方法的执行顺序,确保 formController.setValue()onValueChanged 回调之前执行 • 修复 oldValue 获取逻辑,在 formController 更新前正确保存旧值,避免懒加载问题 • 解决在 onValueChanged 回调中通过 formController.getValue() 获取到旧值的问题 • 修复联动计算、复合字段更新等场景中的时序不准确问题
    • 🎯 影响范围 • 修复 MapSelectionMixinDictStateJunnyAddressFieldJunnyWeekField 等组件的联动更新时序 • 确保税务计算、地址选择、数据字典等复杂联动场景的准确性 • 提升表单字段间联动计算的可靠性和一致性
  • 🐛 修复:税率字典枚举字段值变为 null 的问题
    • 🔧 问题分析 • 税率组件通过 isTaxRateEnum 判断,只保存转换后的数值(如 {taxRate: 0.01}) • 继承的父类 onValueChanged() 逻辑会尝试查找字典项并重新调用 updateValue() • 导致税率值在选择后又被清空为 null 的循环问题
    • 🔧 修复方案 • 在 JunnyDictEnumFieldState 中重写 onValueChanged() 方法 • 税率类型跳过父类的字典查找逻辑,避免循环调用 • 普通字典组件继续使用父类的完整逻辑,保持兼容性
  • 🐛 修复:防止 onValueChanged 循环调用问题
    • 🔧 问题识别 • 检查所有重写了 onValueChanged 的组件,发现潜在的循环调用风险 • JunnyDictFieldState 父类在 onValueChanged 中调用 updateValue() 可能导致循环 • JunnyDictEnumFieldState 税率分支中的字典查找逻辑已被移除
    • 🔧 防护机制 • 在 JunnyDictFieldState 中添加 _isUpdating 标志防止循环调用 • 使用 try-finally 确保标志正确重置 • 参考 JunnyAddressFieldMapSelectionMixin 的成功实践
    • 测试验证 • 添加完整的时序测试用例,验证修复效果 • 确保现有功能不受影响,保持向后兼容性 • 提供演示页面展示修复前后的差异

2025-07-01 - v0.0.15 #

  • 🎨 优化:统一查看模式下的文本颜色策略
    • 🔧 颜色统一优化 • 统一所有表单组件在只读状态下使用 themeData.disabledColor • 修改 input_state.dartnum_range_field.dartdate_time_range_field.dart • 移除不一致的自定义透明度方案,遵循系统主题设计规范
    • 🎯 系统化设计 • 保持与 Material Design 系统规范的完全一致性 • 用户可通过应用主题层面配置 disabledColor 调整只读文本颜色 • 确保所有组件在查看模式下颜色表现一致,提升 UI 专业性
  • 🐛 修复:子表组件查看模式下的交互问题
    • 🔧 交互优化 • 修复 parentDecorationEnabled 逻辑,支持查看模式下的点击跳转功能 • 优化列表页面权限控制,查看模式下不显示编辑相关操作按钮 • 完善自定义列表页面构建器的状态传递机制
    • 🎯 用户体验提升 • 查看模式下仍可点击跳转查看详情,但不显示编辑操作 • 与附件组件的交互行为保持一致 • 在组件层面统一控制,业务层无需额外关心表单字段的 readOnly 状态
  • 🔖 版本
    • 升级版本至 0.0.15

2025-06-28 - v0.0.14+1 #

  • 🐛 修复:JunnySubtableFieldController 缺少 tableCode 参数
    • 🔧 控制器优化 • 为 JunnySubtableFieldController 构造函数添加必填的 tableCode 参数 • 添加断言验证确保 tableCode 不为空,提供清晰的错误提示 • 优化 tableCode 的获取方式,避免重复解析,直接从控制器获取
    • 📝 代码质量提升 • 移除不合理的空字符串默认值 • 使用立即执行函数确保参数验证 • 提升类型安全性和代码健壮性
  • 🔖 版本
    • 升级版本至 0.0.14+1

2025-06-28 - v0.0.14 #

  • 新增:子表组件参数优化
    • 🔧 参数增强 • 为 actionsBuilder 添加 BuildContext 参数,支持在操作按钮构建时访问上下文 • 为 itemActionsBuilder 添加 BuildContext 参数,支持在条目操作按钮构建时访问上下文 • 新增必填的 tableCode 参数,用于标识子表的上下文,便于在复杂表单场景中区分不同子表实例
    • 🎯 上下文分离优化 • 优化 listPageBuilder 参数设计,区分导航 context 和列表页面 context • 导航 context 用于页面跳转,列表页面 context 用于构建操作按钮 • 修复 context 混用导致的潜在问题
    • 📝 文档和示例更新 • 更新所有相关的文档注释和使用示例 • 更新 README.md 中的示例代码 • 确保类型安全和向后兼容性
  • 🔖 版本
    • 升级版本至 0.0.14

2025-06-28 - v0.0.13 #

  • 📦 包体积优化
    • 🗂️ 发布文件优化 • 添加完善的 .pubignore 文件,排除构建缓存、开发文件等不必要内容 • 排除 build/、issues/、示例应用平台文件等,显著减少包体积 • 从 18MB 优化至几 MB,提升下载和安装效率
    • 🔧 依赖版本约束修复 • 修复 dio、junny_utils、junny_widget、provider 依赖的版本约束问题 • 添加明确的版本范围,避免发布时的警告信息 • 提升包的稳定性和兼容性
  • 🔖 版本
    • 升级版本至 0.0.13

2025-06-28 - v0.0.12 #

  • 🐛 修复:选择类组件和输入框组件 hintText 样式不一致问题
    • 🎯 样式统一优化 • 修复选择类组件(JunnyChoiceField、JunnyDictField 等)与输入框组件(JunnyTextField)的 hintText 样式差异 • 通过在 InputDecorator 中设置 baseStyle 解决样式渲染差异 • 确保所有组件使用相同的 hintText 样式:_themeData.textTheme.bodyMedium?.copyWith(color: _themeData.hintColor)
    • 🔧 readOnly 模式 hintText 显示修复 • 修复输入框组件在 readOnly 模式下仍显示 hintText 的问题 • 统一选择类组件和输入框组件在只读状态下的 hintText 行为 • 只读模式下不再显示 hintText,符合 Material Design 规范
    • 🎨 组件内容渲染优化 • 修复选择类组件 buildContent 方法中空值时返回空 Text 导致 hintText 不显示的问题 • 空值时返回 SizedBox.shrink(),让 InputDecorator 正确显示 hintText • 提升用户体验,确保提示文本在合适的时机显示
  • 🔖 版本
    • 升级版本至 0.0.12

2025-06-23 - v0.0.11+2 #

  • 🔧 配置优化:SDK 版本约束调整
    • 🎯 版本兼容性提升 • 将 SDK 版本约束从 ^3.5.4 修改为 ">=3.5.4 <4.0.0" • 采用更合理的版本约束,既避免严格限制又符合包发布最佳实践 • 允许使用 3.5.4 及以上的所有 3.x 版本,防止 4.0.0 重大更改 • 减少因 SDK 版本不匹配导致的构建失败,同时确保发布包的稳定性
  • 🔖 版本
    • 升级版本至 0.0.11+2

2025-06-21 - v0.0.11+1 #

  • 🐛 修复:附件组件只读模式下无法点击查看问题
    • 🔧 JunnyAttachmentFieldState 装饰器启用逻辑修复 • 重写 parentDecorationEnabled 属性,移除只读限制 • 附件组件在只读模式(readOnly = true)下仍然可以点击查看附件 • 保持完全禁用(enabled = false)时的正确行为 • 不影响其他选择类组件的现有行为
    • 🎯 用户体验优化 • 解决附件字段在查看模式下被禁用的问题 • 支持只读模式下跳转到选择页面查看附件内容 • 符合附件字段的设计场景和用户期望
  • 🔖 版本
    • 升级版本至 0.0.11+1

2025-06-18 - v0.0.11 #

  • 🐛 修复:子表组件缺失默认 hintText 问题
    • 🔧 新增 emptyDataBuilder 全局配置 • 在 JunnyFormGlobalConfig 中添加 emptyDataBuilder 字段 • 默认返回 "暂无数据" 提示文本 • 支持国际化自定义配置
    • 🔧 修复 JunnySubtableFieldState • 为 JunnySubtableFieldState 实现 getDefaultHintText 方法 • 使用 emptyDataBuilder 获取空数据提示文本 • 不拼接 title,直接显示简洁的空数据提示
    • 📝 更新测试用例 • 在测试页面中添加子表组件测试用例 • 验证子表组件的默认 hintText 显示效果
    • 🎨 代码规范优化 • 修正 global_config.dart 中字段的字母序排序 • 确保代码完全符合开发规范
    • 📚 项目记忆更新 • 记录修复过程和最佳实践 • 完善组件开发规范文档
  • 🔖 版本
    • 升级版本至 0.0.11

2025-06-16 - v0.0.10 #

  • 🐛 重要修复:选择类组件智能适配数据更新问题
    • 🔧 智能适配逻辑优化 • 修复智能适配功能在数据更新时被 _isUpdating 条件错误跳过的问题 • 确保接口返回的扁平化数据能正确转换为组件期望的 Map 结构 • 移除不必要的更新状态判断,保留防循环适配机制 • 解决有数据的字段仍然显示为空或显示 '{}' 的问题
    • 📊 数据处理增强 • 项目所属公司字段正确显示数据 • 关联中标信息字段正确显示数据 • 项目经理字段正确显示数据 • 空值字段正确构建数据结构,支持 hint 显示
    • 🧪 测试验证 • 添加扁平化数据适配测试页面 • 验证智能适配在各种场景下的正确性 • 确认向后兼容性
  • 🔧 重要修复:附件字段columnCode自动设置功能
    • 🎯 数据完整性保障 • 新增 _ensureColumnCode 方法,确保每个附件对象包含正确的 columnCode 字段 • 修改 _handleAssetsResult 方法,在保存前自动处理所有附件对象 • 确保 columnCode 字段始终被设置为当前字段名,符合业务数据结构要求
    • 📊 数据存储优化 • 优化附件数据存储逻辑,确保数据唯一来源于嵌套结构 • 避免字段本身和 attachments 字段的数据混淆 • 提升数据一致性和可靠性
    • 🛠️ 类型安全提升 • 更新全局配置中 selectAttachments 的返回类型定义 • 从 List<Map<String, dynamic>> 更新为 Iterable<Map<String, dynamic>>? • 提升类型安全性和灵活性
    • 🛡️ 向后兼容性 • 保持现有 API 使用方式不变 • 自动处理附件数据,无需手动设置 columnCode • 确保所有附件相关功能正常工作
  • 🔖 版本
    • 升级版本至 0.0.10

2025-01-15 - v0.0.9 #

  • 🐛 重要修复:选择类组件 hintText 重叠显示问题
    • 🔧 修复重叠 hintText 渲染 • 修复选择类组件(JunnyChoiceField、JunnyDateField、JunnyChipsField 等)出现重叠 hintText 的问题 • 移除 buildContent 中手动的 hintText 渲染逻辑,统一由 InputDecorator 处理 • 确保所有组件的 hintText 样式完全一致 • 包括字典多选、标签多选、地址选择等所有选择类组件
  • 🏷️ 全局配置字段重命名优化
    • 📝 简化字段命名filterPlaceholderBuilderfilterHintBuilderpleaseSelectPlaceholderBuilderpleaseSelectHintBuilderpleaseEnterPlaceholderBuilderpleaseEnterHintBuilder • 统一使用 HintBuilder 后缀,提升代码可读性
    • 🔄 向后兼容性 • 需要更新初始化代码中的参数名 • 功能保持完全不变,仅为命名优化
    • 🔧 JunnySelectionFieldState.buildContent 修复 • 修复选择类组件(JunnyChoiceField、JunnyDateField 等)当值为空时不显示 hintText 的问题 • 当 formatValue(value) 为空且存在 hintText 时,正确显示带有 hintStyle 样式的提示文本 • 保持现有值不为空时的显示逻辑不变 • 确保选择类组件与输入类组件具有一致的 hintText 显示行为
    • 🏷️ 全局配置字段重命名 • 将 pleaseSelectBuilder 重命名为 pleaseSelectPlaceholderBuilder • 将 pleaseEnterBuilder 重命名为 pleaseEnterPlaceholderBuilder • 更新所有相关引用,包括 JunnyFormGlobalConfig.init 方法参数 • 统一占位符构建器的命名规范,符合 pleaseXXXPlaceholderBuilder 格式
    • 🛡️ 向后兼容性 • 功能修复不影响现有 API 使用方式 • 字段重命名需要更新初始化代码中的参数名 • 保持所有组件的默认行为和样式不变
  • 🔖 版本
    • 升级版本至 0.0.9

2025-06-11 - v0.0.8 #

  • 🐛 重要修复:Filter 组件状态恢复错误
    • 🔧 FilterSearchBar 异常处理增强 • 修复 FilterSearchBar._getHintText 方法中访问 field.effectiveInputDecoration 时的 RestorableValue.value 错误 • 添加异常处理机制,当状态恢复失败时使用备用的 hintText 获取方案 • 确保筛选弹窗可以正常重复打开,不会因状态恢复问题导致应用崩溃 • 解决 TextField 第一次输入正常,再次打开筛选弹窗时出现错误的问题
    • 🛡️ 稳定性提升 • 向后兼容,不影响现有功能 • 安全可靠,避免状态访问异常 • 确保始终有合理的 placeholder 显示
  • 新功能:字典多选字段数组格式支持
    • 🎯 JunnyDictChipsField 数据格式扩展 • 新增 saveAsArray 参数,允许将值保存为 List<String> 格式 • 支持灵活的数据保存格式配置,同时保持向后兼容 • 默认保存为逗号分隔字符串,可配置为数组格式
    • 📊 智能数据处理 • 调整 _initValueByCodesonValueChanged 方法,兼容字符串和数组两种数据格式 • 自动识别外部数据类型,根据配置明确表单数据类型 • 优化类型安全性,避免不必要的类型转换
    • 🔧 参数模型完善 • 更新 JunnyFormDictChipsParams 类,添加 saveAsArray 字段配置 • 包括构造函数、copyWith、toMap、fromMap、相等性比较的完整支持
  • 新功能:智能默认 hintText 生成
    • 🎯 自动提示文本生成 • 输入类组件:自动生成 '请输入' + title • 选择类组件:自动生成 '请选择' + title • 基于虚方法的类型安全设计,零侵入性实现
    • 🔧 技术实现优化 • 在基类 JunnyFormFieldState 中定义虚方法 getDefaultHintText() • 在 JunnyInputFieldState 和 JunnySelectionFieldState 中重写此方法 • 通过 inputDecoration getter 动态注入默认 hintText • 保持用户自定义 hintText 的优先级
    • 📊 全局配置扩展 • 新增 pleaseSelectPlaceholderBuilder 和 pleaseEnterPlaceholderBuilder 配置项 • 支持自定义默认提示文本生成规则 • 减少重复的 hintText 设置工作
  • 🔧 优化:选择字段参数系统重构
    • 参数类型体系完善 • 新增 SelectionTapParams
    • 🎯 功能特性增强 • 支持选项禁用条件 (disabledWhen) • 支持选项隐藏条件 (hiddenWhen) • 支持自定义选项标题构建器 (optionTitleBuilder) • 为 JunnyChoiceField 添加完整的 selectionParams 支持
  • 🛠️ 代码质量提升
    • 修复 BoxConstraints 错误:确保 maxWidth >= minWidth
    • 统一 hintText 显示行为:默认和自定义获得相同处理路径
    • 类型安全(无 dynamic 类型),编译时检查(无运行时反射)
    • 高扩展性(新组件只需重写一个方法),性能优秀(只在初始化时计算一次)
  • 🔖 版本
    • 升级版本至 0.0.8

2025-05-29 - v0.0.7 #

  • 新增功能:附件组件自定义字段名支持
    • 🔧 JunnyAttachmentField 增强 • 新增 attachmentsFieldName 参数,默认为 'attachments',支持自定义为 'testAttachments' 等 • 新增 deleteAttachmentsFieldName 参数,默认为 'deleteAttachments',支持自定义为 'testDeleteAttachments' 等 • 适配特殊页面中使用非标准字段名的业务需求(如同时存在 attachments 和 testAttachments) • 保持完全向后兼容性,默认行为不变
    • 📊 数据处理优化 • 更新 _getAttachmentsFromFormData() 方法支持自定义字段名 • 更新 _updateAttachmentsToFormData() 方法支持自定义字段名 • 更新 _syncInitialData() 方法支持自定义字段名 • 更新 _updateDeletedAttachments() 方法支持自定义删除字段名
    • 🛠️ 参数配置增强 • 更新 JunnyFormAttachmentParams 类,添加字段名配置选项 • 提供默认值,确保大多数情况下无需显式配置 • 完善类型安全和参数验证
    • 📝 文档和示例 • 更新组件文档注释,说明自定义字段名功能 • 在示例页面中添加自定义字段名使用演示 • 更新 README 文件,提供详细的使用说明和数据结构示例
  • 🔖 版本
    • 升级版本至 0.0.7

2025-05-29 - v0.0.6 #

  • 🚀 重大更新:附件组件v3版本适配
    • ✨ 全面重构 JunnyAttachmentField 以支持v3版本API数据结构 • 支持完整附件元数据存储,不再仅保存fileId • 按照v3数据结构存储:attachments.{fieldName}deleteAttachments.{fieldName} • 自动处理删除附件跟踪,无需手动管理 • 优化数据获取性能,减少不必要的网络请求
    • 🔧 性能优化 • 修复重复的值变化触发问题 • 移除重复的监听器添加,避免内存泄漏 • 解决循环调用风险,优化数据获取逻辑 • 实现延迟更新机制(200ms防抖),减少频繁UI刷新
    • 📊 数据管理增强 • 双重数据存储策略:同时支持字段本身和attachments字段 • 自动数据同步:初始化时智能同步v3格式数据 • 完善的删除跟踪:自动记录和管理删除的附件ID
    • 🛠️ 代码质量提升 • 优化生命周期管理,正确处理定时器清理 • 改进错误边界处理,增强稳定性 • 完善文档注释,提供详细的使用说明和示例
  • 📝 配置更新
    • 更新 AttachmentTapParams 参数结构以适配新的数据格式
    • 优化全局配置中的附件相关方法签名
  • 🔖 版本
    • 升级版本至 0.0.6

2025-05-16 - v0.0.5 #

  • 📝 文档
    • 完善 JunnyFormFieldStateparentDecorationEnabled getter 的文档注释,阐明其与 enabledreadOnly 状态的交互行为
  • ⚙️ 杂项
    • 将示例项目的 Android .cxx 目录添加到 .gitignore
    • 停止追踪示例项目的 Android .cxx 目录
  • 🔖 版本
    • 升级版本至 0.0.5

2025-05-15 - v0.0.4+2 #

  • 新增功能:表单字段类型转换器
    • 🔧 FormFieldTypeConverter 实现 • 实现基础类型、集合类型的安全转换 • 支持可空性和泛型元素类型处理 • 集成到 JunnyFormFieldState 中进行值转换
  • ♻️ 重构优化
    • 🛠️ JunnyFormFieldState 重构 • 调整类成员顺序和注释,符合最新规范 • 优化部分 Getter 和私有方法的实现
    • 🎯 JunnyWidgetField 布局控制增强 • 允许用户通过 JunnyFormWidgetParams 中的 preventChildExpansiondefaultChildAlignment 参数更精细地控制自定义子组件的布局行为 • 如果 builder 返回 Align 组件,则直接使用用户的 Align 设置 • 非 Align 组件默认情况下会防止意外拉伸并左对齐,但此行为可通过新参数配置 • 优化了内部 hintText 的处理逻辑,确保自定义组件上方提示的正确显示,并避免与 InputDecorator 的默认行为冲突
  • 📝 代码质量提升
    • 调整了 JunnyFormWidgetParams 类中成员的声明顺序,以符合 Dart 编码规范
    • 移除了 JunnyWidgetField 构造函数中冗余的 hintText: null 参数
    • 详细更新了 JunnyWidgetFieldJunnyFormWidgetParams 的文档注释,说明了新的布局参数和行为
    • 提供了更清晰的示例代码来演示新功能
  • 🔖 版本
    • 升级版本至 0.0.4+2

2025-05-14 - v0.0.4+1 #

  • 🔧 字段优化
    • 优化了 JunnyFormFieldStateInputDecorationhintText 显示逻辑,以确保在特定条件下行为正确
  • 🔖 版本
    • 升级版本至 0.0.4+1

2025-05-14 - v0.0.4 #

  • 📦 依赖更新
    • 更新了多个直接和间接依赖项至其最新的兼容版本,包括 provider, device_info_plus, http
  • 🎨 代码风格
    • 调整了 JunnyFormFieldStateInputState 中的注释结构以符合代码风格指南
  • 🔖 版本
    • 升级版本至 0.0.4

2025-05-13 - v0.0.3 #

  • 🔧 全局配置优化
    • nullErrorMessageBuilder 函数现在接收 BuildContext 参数
    • selectAttachments 函数添加了 BuildContext 参数
    • subtableLengthBuilder 函数添加了 BuildContext 参数
  • 🛠️ 代码结构优化
    • 优化代码结构,移除多余的区域注释
    • 更新示例代码中的函数签名
  • 🔖 版本
    • 升级版本至 0.0.3

2025-05-09 - v0.0.2 #

  • 🔧 表单控制器优化
    • 优化表单控制器代码结构和注释
    • 改进代码可读性和可维护性
    • 添加详细的函数级文档注释
  • 🔖 版本
    • 升级版本至 0.0.2

2024-11-20 - v0.0.1 #

  • 🎉 初始版本
    • 项目初始化
    • 基础表单组件实现
  • 🔖 版本
    • 初始版本 0.0.1
0
likes
120
points
341
downloads

Publisher

unverified uploader

Weekly Downloads

A flexible Flutter form management library that supports centralized field management, async validation, and custom field types.

Homepage

Documentation

API reference

License

MIT (license)

Dependencies

dio, flutter, junny_utils, junny_widget, meta, provider

More

Packages that depend on junny_form