每日见闻之Flutter 怎么设置全局字体

1 在项目中添加字体文件,位置无所谓只要自己能找到

2 在yaml文件声明

yaml 复制代码
fonts:
  - family: CalSans-Regular
    fonts:
      - asset: assets/fonts/CalSans-Regular.ttf

之后我们用的字体就是 CalSans-Regular

3 设置全局字体

3.1 在 MaterialApp 的theme设置

css 复制代码
theme: ThemeData(
   fontFamily: "CalSans-Regular",

3.2 在Material 的 textStyle 设置

less 复制代码
 Material(
  color: bgColor ?? const Color(0xFFECECF7),
  textStyle: const TextStyle(
    fontFamily: "CalSans-Regular"
  ),

等等等。。。

但是发现设置了之后,可能还是有部分不生效

4 为什么不生效呢?

ini 复制代码
@override
Widget build(BuildContext context) {
  final DefaultTextStyle defaultTextStyle = DefaultTextStyle.of(context);
  TextStyle? effectiveTextStyle = style;
  if (style == null || style!.inherit) {
    effectiveTextStyle = defaultTextStyle.style.merge(style);
  }
  if (MediaQuery.boldTextOf(context)) {
    effectiveTextStyle = effectiveTextStyle!.merge(const TextStyle(fontWeight: FontWeight.bold));
  }

上面的代码是Text 组建的build方法中的代码,注意这里 DefaultTextStyle,如果我们没有手动给Text的style 设置字体,那么就会使用这里返回的DefaultTextStyle 中的字体。

DefaultTextStyle.of(context) 这种代码大家应该很熟悉,就是向上查找找到第一个指定类型的 InheritedWidget。

在 Material MaterialApp 这些组件中设置字体,最终也是生成了一个DefaultTextStyle,包裹住了他的子组件。

如果你设置了字体但是不生效,大概率就是在组件链中被插入了DefaultTextStyle,导致没有应用你设置的字体。

同理如果你只是想让局部应用某种字体,那么你也可以嵌套一层DefaultTextStyle。

相关推荐
安东尼肉店7 小时前
Android compose屏幕适配终极解决方案
android
2501_916007477 小时前
HTTPS 抓包乱码怎么办?原因剖析、排查步骤与实战工具对策(HTTPS 抓包乱码、gzipbrotli、TLS 解密、iOS 抓包)
android·ios·小程序·https·uni-app·iphone·webview
feiyangqingyun8 小时前
基于Qt和FFmpeg的安卓监控模拟器/手机摄像头模拟成onvif和28181设备
android·qt·ffmpeg
用户20187928316712 小时前
ANR之RenderThread不可中断睡眠state=D
android
煤球王子12 小时前
简单学:Android14中的Bluetooth—PBAP下载
android
小趴菜822712 小时前
安卓接入Max广告源
android
齊家治國平天下12 小时前
Android 14 系统 ANR (Application Not Responding) 深度分析与解决指南
android·anr
ZHANG13HAO12 小时前
Android 13.0 Framework 实现应用通知使用权默认开启的技术指南
android
【ql君】qlexcel13 小时前
Android 安卓RIL介绍
android·安卓·ril
写点啥呢13 小时前
android12解决非CarProperty接口深色模式设置后开机无法保持
android·车机·aosp·深色模式·座舱