lilili_ui_core 0.5.0
lilili_ui_core: ^0.5.0 copied to clipboard
Fluent Modifier/Box chaining, Vue-inspired reactive state (ref/computed/watch), slots (SlotHost/Slot/ScopedSlot), and directives (v-if/v-show/v-model) helpers for flattening Flutter widget trees.
0.5.0 #
两个来自真实项目、flutter analyze 抓不到、只在运行时暴露的故障,这一版从签名和布局两侧堵住。
Breaking #
-
Modifier.background()现在只接受Color(此前是dynamic)。传LinearGradient这类Gradient时旧版编译期毫无提示,运行时才抛ArgumentError(Gradient既不是Color也不是Decoration)。现在按类型拆成三个方法,传错在 analyze 阶段即报错:background(Color color, {BorderRadiusGeometry? borderRadius})gradient(Gradient gradient, {BorderRadiusGeometry? borderRadius})—— 新增decoration(Decoration decoration)—— 新增,替代原来的background(someDecoration)
迁移:
background(myDecoration)→decoration(myDecoration);渐变从手写background(BoxDecoration(gradient: ...))→gradient(...)。 原先background(Decoration, borderRadius: ...)抛的ArgumentError随之取消——decoration()不再提供borderRadius参数,圆角写在 Decoration 自身上。 -
Modifier.padding()现在只接受num(此前是dynamic,同一类运行时ArgumentError)。 非等距内边距改用新增的三个方法:paddingSymmetric({num horizontal = 0, num vertical = 0})paddingOnly({num left = 0, num top = 0, num right = 0, num bottom = 0})paddingInsets(EdgeInsetsGeometry insets)—— 逃生口,也是EdgeInsetsDirectional的入口
迁移:
padding(EdgeInsets.symmetric(horizontal: 8))→paddingSymmetric(horizontal: 8)或paddingInsets(...);padding(16)不变。 内部辅助函数toEdgeInsets()随之删除(原本就不在导出面上)。
修复 / 新增 #
expanded()/flexible()在链条中的位置不再重要:applyTo会把生成的Flexible提到最外层。 此前写在padding()等修饰项之后会触发 Flutter 的 "Incorrect use of ParentDataWidget"。 同一条链里重复声明 flex 现在命中 assert。- 新增 Widget 级扩展
.expanded({flex})/.flexible({flex})(FlexWidgetX)。 Modifier 级的 flex 只管到 Box 自身:Box 外面再套一层自定义外壳时,Flexible会被关在壳里, 且当壳内部恰好有Row/Column时会被那一层无声认领——不报错,只表现为外层 Row 的子节点 没有约束(文字被裁、卡片不铺满)。这种场景把.expanded()接在最外层 Widget 之后即可。 该失效形状已在test/flex_test.dart中作为回归用例固化。
0.4.1 #
- 修复:
Modifier.border()的描边会被链条中随后的background()完全盖掉。border()改用DecorationPosition.foreground(描边画在 child 之上),行为对齐foregroundDecoration。注意描边仍不占布局空间(不像Container会按边框宽度内缩 child),会覆盖 child 边缘width逻辑像素。
0.4.0 #
- 新增 v-show 指令:
Modifier.show(bool)/Modifier.showWhen(ReadonlyRef<bool>)(Offstage 实现,隐藏但保留子树 State) - 新增 v-model 双向绑定组件族:
VTextField(内管 controller,防回环,IME composing 兼容)、VCheckbox、VSwitch、VSlider、VRadio<T>、VDropdown<T> - 最低 Flutter 版本升至 3.32(
RadioGroupRegistry/Radio.groupRegistry/Radio.enabled迁移与Switch.activeThumbColor所需) VSwitch的activeColor映射到Switch.activeThumbColor(仅拇指色,非轨道色)VRadio内部采用RadioGroupRegistry方案(自定义 no-op shim,详见VRadiodartdoc)- 外部等长替换保留选区;VSlider 越界模型值下一帧回写为 clamp 值;示例补充静态 .show 演示
0.3.2 #
- 修复:computed 的 getter 抛出异常后,后续上游变更不再触达下游(effect/Widget 永久失联)的缺陷。失败的重算/校验现在会允许下一次上游写入重新传播,读取重算成功即自愈。注意:若 getter 在读取任何响应式依赖之前就抛出,computed 将没有任何上游订阅,只能通过直接读取
.value自愈——建议 getter 先读依赖再做校验。
0.3.1 #
- 内部优化(无 API 变化):
- computed 采用版本化 push-pull 失效模型,消除菱形依赖下的冗余重算(每个 computed 每轮至多重算一次)
- effect/Widget 观察者重跑前做依赖版本校验短路
- 内部 watchEffect/watch 实现类去重
0.3.0 #
- 新增 Vue 风格插槽系统:
SlotContent/SlotContent.builder<T>(填槽标记,具名槽与作用域槽)SlotHost(组件作者包裹层,InheritedWidget)Slot(具名/默认槽占位,支持 fallback)与Slot.def()(默认槽构造)ScopedSlot<T>(作用域槽占位,运行时泛型校验)
0.2.0 #
- 新增响应式状态系统(从零实现,零依赖):
ref/computed(惰性缓存派生值)watchEffect/watch(新旧值回调)/nextTickWatch(细粒度订阅 Widget)/ReactiveWidget(整页订阅基类)
- 微任务批处理更新 + 循环依赖检测
0.1.0 #
- 初始发布:Modifier + Box 链式修饰系统
- wgtIf / wgtFor 条件与列表渲染语法糖
- GapX / EdgeInsetsX 基础扩展方法糖