flutter_miuix 1.1.0
flutter_miuix: ^1.1.0 copied to clipboard
A HyperOS-style component library for Flutter, ported from miuix. 45+ widgets with squircle corners, Folme spring motion, liquid glass blur, and Monet dynamic colors.
Changelog #
1.1.0 #
新增 #
- 文字字重跟随系统(fontWeightAdjustment):此前未指定字重的文本一律按 Flutter 默认
w400渲染,不随系统字体粗细度变化;而 MiuiX Compose 依托 Android 平台自动施加的Configuration.fontWeightAdjustment,会把一个偏移量整体加到每段文字最终解析出的字重上(正文 400→500、半粗标题 600→700、粗体标题 700→800)。移植版现复刻该机制:MiuixThemeData新增fontWeightAdjustment(权重数值,100 为一档),组件在渲染时把偏移应用到最终字重(未指定按w400处理)。MiuixSystemTheme/MiuixThemeController默认读MediaQuery.boldTextOf自动跟随系统「粗体文字」(开启 +100,可由boldTextFontWeightAdjustment调整),也可用fontWeightAdjustment显式指定任意值关闭自动跟随。新增底层辅助adjustFontWeight()与TextStyle.withMiuixWeight()。fontWeightAdjustment == 0(默认)时行为与旧版完全一致,无回归。
1.0.9 #
修复 #
- 大标题折叠后稍微下滑立即弹回大标题(1.0.8 门控仍未根治):
ExitUntilCollapsedScrollBehavior此前把heightOffset当成独立累加量(逐 delta 门控增减),并在松手时用弹簧snap吸到端点。snap会把heightOffset拉到完全折叠/展开,而真实滚动位置pixels仍停在顶部过渡区中段——两者就此解耦:折叠到居中小标题后轻微下滑,门控发现pixels尚在过渡区,按增量把标题又展开,视觉上"稍微一动就弹回大标题"。现改为按位置直接映射:heightOffset = -(pixels - minScrollExtent),再由 setter 钳到[heightOffsetLimit, 0]。折叠量恒为滚动位置的纯函数,只有内容滚回顶部对应位置才逐像素恢复,中途上/下滑绝不跳变(对齐 iOS/标准大标题语义)。随之移除累加门控、松手snap(弹簧动画)、AnimationController/TickerProvider依赖,MiuixScrollBehaviorListener降为无状态组件。回归测试同步更新test/top_app_bar_scroll_gate_test.dart。
1.0.8 #
修复 #
- 大标题在列表中部下滑时被弹回展开:
ExitUntilCollapsedScrollBehavior此前对上滑/下滑对称累加heightOffset,在列表任意位置轻微下滑都会立即展开顶栏(松手后还被 snap 完整弹回大标题),偏离 Kotlin 原版"下滑仅在内容到顶后才展开"的语义。现改为按内容位置门控:只统计发生在顶部过渡区间[minScrollExtent, minScrollExtent + 展开量]内的滚动行程——中部下滑门控量恒为 0 保持折叠,滚回顶部区间才逐像素展开(含 iOS 弹性下拉过顶段);上滑折叠只忽略回弹归位段(min 以下),其余不变。AndroidClampingScrollPhysics到顶后scrollDelta被钳成 0 的场景(当年对称累加的动机),改用顶部OverscrollNotification(overscroll < 0)驱动展开,对应 KotlinonPostScroll的"剩余下滑量"。回归测试test/top_app_bar_scroll_gate_test.dart。 - 内嵌子列表误驱动顶栏折叠:
handleScroll未过滤通知来源,页面内嵌套的横向/内层滚动视图(如卡片里的横向列表)滚动时也会牵动大标题。现仅响应depth == 0且竖向轴的通知。
1.0.7 #
修复 #
- PullToRefresh 下拉中段触发 RenderFlex 溢出断言:刷新头内容(指示圈 + 文案)在
SizedBox(height: 动画高度)的受限约束内用Column布局,头部尚未展开到内容自然高度时(进度约 < 0.7)每帧抛出 "overflowed by N pixels on the bottom"(视觉上本就被ClipRect裁剪,仅调试期噪音)。现在ClipRect内垫一层顶部锚定、纵向无界的OverflowBox,内容始终按自然高度布局、由裁剪负责渐显,视觉行为不变、断言消除。
1.0.6 #
修复 #
- TopAppBar 超长标题溢出屏幕:主/副标题的
Text位于Positioned(left, top)下,宽度无界,maxLines: 1 + ellipsis永远不触发,长标题直接画出屏幕。现按当前折叠进度计算可用宽度(大端点右留titlePadding对称边距、小端点避开 actions)并用ConstrainedBox显式限宽,超长时正确显示省略号;折叠端点的居中定位同步改用钳制后的文字宽度,避免超长标题的目标位置压到导航图标上。
1.0.5 #
修复 #
- 对话框被输入法遮挡:
MiuixOverlayDialog在手机上底部锚定,但底边距只计算了安全区,未计入键盘高度(viewInsets.bottom)。现在面板随键盘上移(AnimatedPadding平滑跟随,取键盘高度与底部安全区较大值),对应 Compose 版imePadding语义。 - 弹层宿主拆卸期断言:整棵树销毁时
MiuixDialogLayout.dispose的dismiss()会同步触发宿主可见性回调,在已 deactivate 的 element 上读MediaQuery抛 "deactivated ancestor" 断言。回调入口现已短路。
1.0.4 #
修复 #
- TopAppBar 折叠标题飞出屏幕:
MiuixIconButton/MiuixButton/MiuixFloatingActionButton内部Center未设widthFactor/heightFactor,在有界宽松约束下被撑满可用空间(ComposedefaultMinSize语义应贴内容尺寸)。TopAppBar 测量层因此把导航图标测成整屏宽,折叠标题的避让目标被推到屏幕外——滚动时标题向右飞出。现已改为贴内容尺寸;注意这同时意味着按钮在 Column/ListView 等有界宽松上下文中不再自动撑满宽度(需要全宽时请自行包SizedBox(width: double.infinity))。 - 折叠标题目标位置防御性钳制:无论 nav/actions 测量结果如何,折叠目标绝不超出可视范围。
- 吸附动画与手势争抢:松手后的吸附动画不会被新滚动手势取消,与手势输入争抢
heightOffset(症状:折叠到底后被残留动画拉回展开、滚动中标题抖动)。现在新手势开始时停止残留吸附动画。
1.0.3 #
修复 #
- MiuixTextField 点击无法聚焦:占位/浮动标签的
Text叠在内部TextField之上且参与命中测试(RenderParagraph命中即止),点在占位文字上事件被吞掉,无法唤起键盘。标签现包裹IgnorePointer。 - MiuixTextField 整块可点击:背景、内边距与非交互图标区域此前不可点击(有效点击区仅剩文本行本身)。现在整个输入框区域点击均聚焦唤起键盘(与 Compose 原版一致);内部 trailing 按钮等更深层手势优先级不受影响。
新增 #
- MiuixTextField.autofocus:挂载后自动聚焦并唤起键盘(常用于对话框内输入框),默认
false。
1.0.2 #
修复 #
- MiuixTextField:
textInputAction/textCapitalization/onSubmitted此前未转发给内部TextField,导致键盘 action 键(搜索/完成)与提交回调不生效。现已正确转发。 - 弹层 entry 双重 dispose:承载弹层的路由整体 pop 时,
MiuixDialogLayout/MiuixPopupLayout的 State 与 popup host 的 HostedEntry 会在同一帧卸载,双方的 orphaned 判断同时成立并各自调用entry.dispose(),抛 use-after-dispose 断言。MiuixPopupEntry.dispose现已幂等(新增isDisposed),二次调用为无害 no-op。
变更 #
- 包结构调整:实现文件移入
lib/src/,仅保留lib/miuix.dart作为唯一公开入口。pub.dev 安装页现在只显示一行import 'package:flutter_miuix/miuix.dart';,不再逐个列出内部文件。公开 API 与导入方式不变。
1.0.0 #
首个发布版本。miuix(Kotlin Multiplatform)组件库到 Flutter 的 1:1 移植。
新增 #
- 完整组件覆盖:45+ 个组件,覆盖 Button / TextField / Switch / Slider / Checkbox / RadioButton / NavigationBar / FloatingNavigationBar / NavigationRail / Scaffold / TopAppBar / SmallTopAppBar / TabRow / BreadcrumbBar / Card / Badge / Divider / SmallTitle / BasicComponent / 各类 Preference / Dropdown / Spinner / CascadingMenu / NumberPicker / ColorPicker / ColorPalette / DatePicker / BottomSheet / FloatingToolbar / Dialog / Snackbar / Tooltip / ProgressIndicator / SearchBar / ScrollBar / PullToRefresh / Surface 等。
- Squircle 超椭圆圆角:
MiuixSquircleBorder复刻 iOS/HyperOS 圆角。 - Folme 弹簧动效:
MiuixSpringEngine+folmeSpring(damping, response)。 - 液态玻璃:
MiuixTextureBlur(ImageFilter.blur高斯模糊 + 颜色控制)、MiuixHighlight(着色器 bloom 高光描边)、MiuixLayerBackdrop/MiuixLayerBackdropCapture背景捕获;另有一行开启的毛玻璃顶栏MiuixTopAppBar(blurred: true)。 - Monet 动态取色:基于
material_color_utilities+dynamic_color,从壁纸或种子色生成整套 miuix 配色(27 个语义角色)。 - OkLab / OkLCH / OkHSV 色彩空间:完整移植原版感知均匀色彩数学。
- 矢量图标系统:
MiuixVectorIcon+MiuixBasicIcons(7 个基础图标)/MiuixExtendedIcons(156 个扩展图标 × 5 字重)。 - 主题体系:
MiuixTheme/MiuixThemeData/MiuixThemeController,支持明暗模式与动态取色。