前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Flutter中如何设置全局字体

Flutter中如何设置全局字体

作者头像
BennuCTech
发布2022-11-11 10:27:22
2.7K0
发布2022-11-11 10:27:22
举报
文章被收录于专栏:BennuCTechBennuCTech

引入字体

首先在项目中创建fonts目录,然后将将ttf文件放到该目录下,然后在pubspec文件中添加该字体文件,如:

代码语言:javascript
复制
...
flutter:
  fonts:
    - family: PingFang
      fonts:
        - asset: fonts/PingFang-Regular.ttf

  assets:
    - assets/exit_icon.png

这里family是我们自定义的,对应该字体,这里每个字体可以对应多个ttf文件,比如区分加粗:

代码语言:javascript
复制
flutter:
  fonts:
    - family: Raleway
      fonts:
        - asset: assets/fonts/Raleway-Regular.ttf
        - asset: assets/fonts/Raleway-Medium.ttf
          weight: 500
        - asset: assets/fonts/Raleway-SemiBold.ttf
          weight: 600
    - family: AbrilFatface
      fonts:
        - asset: assets/fonts/abrilfatface/AbrilFatface-Regular.ttf
  • family 是字体的名称, 你可以在TextStyle的 fontFamily 属性中使用.
  • asset 是相对于 pubspec.yaml 文件的路径.这些文件包含字体中字形的轮廓。在构建应用程序时,这些文件会包含在应用程序的asset包中。

可以给字体设置粗细、倾斜等样式

  • weight属性指定字体的粗细,取值范围是100到900之间的整百数(100的倍数). 这些值对应 FontWeight, 可以用于 TextStyle的fontWeight属性
  • style 指定字体是倾斜还是正常,对应的值为italic和 normal. 这些值对应 FontStyle 可以用于TextStyle的 fontStyle TextStyle 属性

引入字体后可以在Text的sytle中使用即可

代码语言:javascript
复制
Text(
    "test",
    style: TextStyle(fontFamily: "Rock Salt",),
)

全局字体

想设置全局字体,则需要在App中设置,如下:

代码语言:javascript
复制
MaterialApp(
  title: title,
  theme: ThemeData(
    primarySwatch: Colors.blue,
    visualDensity: VisualDensity.comfortable,
    fontFamily: "PingFang",
    textTheme: TextTheme(
      ...
    )
  ),
  ...
);

这样全局字体都变成了我们设定的字体。

问题

但是这里有两个小问题(flutter web,其他平台未测):

library中设置失效

我们将基础功能封装到一个library(gitsubmodule形式,所以没有发布)中,其实承载MaterialApp的BaseApp也在library中,所以最开始将字体文件放在了library中,然后在BaseApp的MaterialApp中设置了fontFamily。

但是运行发现字体根本没变化,通过flutter build web编译后发现在build目录下生成的文件中没有这个字体文件。

目前未找到原因,不过有解决方法,简单的解决方法就是在主工程中也放一份该字体文件,同时在主工程的pubspec中也添加该字体(名称与library中保持一致)。这样运行就会发现字体都变过来了,build编译后也生成了该字体文件。

TextSpan中字体未生效

TextSpan可以用来处理图文混合的需求。比如前面一个图片标签,后面是文字,但是文字第二行还要从图片最左端开始,即环绕图片,这种时候就需要TextSpan+WidgetSpan配合只用即可。

但是在flutter web中(其他平台未测),通过上面设置全局字体后,发现TextSpan中的字体并未生效,还是系统字体。

说明TextSpan稍微特殊一些,我们知道Text的源码中style实际上做了一步merge操作,merge了默认的style(defaultTextStyle),如下:

代码语言:javascript
复制
Widget build(BuildContext context) {
    final DefaultTextStyle defaultTextStyle = DefaultTextStyle.of(context);
    TextStyle effectiveTextStyle = style;
    if (style == null || style.inherit)
      effectiveTextStyle = defaultTextStyle.style.merge(style);
    ...
  }

‍‍

可以看到在一开始,将defaultTextStyle和我们单独为这个Text设置的style进行了merge,然后才设置样式,所以只要程序里没有覆盖这个属性,那么就会一直起作用。所以不论是全局样式还是为Text单独设置的样式,只要不冲突就都会生效。

但是在TextSpan的源码中,发现并没有这一步操作,所以设置的全局字体对它不起作用。

所以使用TextSpan的地方如果需要则必须单独设置字体。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-06-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 BennuCTech 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引入字体
  • 全局字体
  • 问题
    • library中设置失效
      • TextSpan中字体未生效
      相关产品与服务
      内容识别
      内容识别(Content Recognition,CR)是腾讯云数据万象推出的对图片内容进行识别、理解的服务,集成腾讯云 AI 的多种强大功能,对存储在腾讯云对象存储 COS 的数据提供图片标签、图片修复、二维码识别、语音识别、质量评估等增值服务。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档