android_system_font_weight 0.3.1
android_system_font_weight: ^0.3.1 copied to clipboard
启动期一次性读取安卓厂商(HyperOS/MIUI、ColorOS、OriginOS、MagicOS 等)的 系统全局可变字重设置,归一化为 wght 轴值。无监听、无刷新,读不到返回 null。
android_system_font_weight #
启动期一次性读取安卓系统全局可变字重(wght 轴),归一化后返回给 Flutter。 无监听、无刷新——设计给"应用启动时注入一次"的场景。
背景 #
国内厂商(HyperOS/MIUI、ColorOS、OriginOS、MagicOS)的"字重调节"滑杆是
framework 私有实现:滑杆值写在各家私有 Settings 键里,注入逻辑钩在
Typeface/minikin 上,只对走官方文本管线的原生应用生效。Flutter 自带文本栈
(SkParagraph + Skia/Impeller),既跑不到厂商钩子、也读不到私有键,因此
系统字重对 Flutter 文本无效。本插件负责把"读私有键"这一半补上,拿到值后
由应用侧(如 ElStyle.fontVariations / TextStyle.fontVariations)注入。
用法 #
final wght = await AndroidSystemFontWeight.getWght(); // double? 100–1000
if (wght != null) {
// 注入根样式,例如 ElApp(style: ElStyle(fontVariations: [FontVariation('wght', wght)]))
}
前提:实际渲染的字体必须是带 wght 轴的可变字体(MiSans VF / OPPO Sans VF / HarmonyOS Sans VF 等,国内新机系统字体均满足)。静态字体设轴无效。
探测策略(三层) #
- 候选键直读:
candidateKeys清单里的厂商键(社区推测 + 通用命名, 无公开文档,命中即用); - 全表扫描:查询
content://settings/{system,secure,global}全部行, 过滤 font/weight/wght/bold 相关键,按启发式归一化(主力路径,可自 发现任意厂商私有键;font_scale是字号缩放,已排除); - AOSP 兜底:
Configuration.fontWeightAdjustment(Android 12+ 粗体 无障碍,布尔粒度 +300)。
值域启发式:'wght' 350 字符串 → 直取;100–1000 → 绝对 wght;(0, 5] 小数
→ ×400 倍率;[-300, 0) → 400+增量;其余语义不明返回 null。
真机定位厂商键 #
getWght() 返回 null 但系统明明有字重滑杆时:
debugPrint((await AndroidSystemFontWeight.debugDump()).toString());
或 adb shell settings list system | findstr /i "font weight",对比拖动
滑杆前后的差异行,把命中的键补进
AndroidSystemFontWeightPlugin.candidateKeys 钉死(也欢迎顺手校正该键的
值域归一化)。