Flutter入门:设置全局字体
Posted BennuCTech
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flutter入门:设置全局字体相关的知识,希望对你有一定的参考价值。
引入字体
首先在项目中创建fonts目录,然后将将ttf文件放到该目录下,然后在pubspec文件中添加该字体文件,如:
...
flutter:
fonts:
- family: PingFang
fonts:
- asset: fonts/PingFang-Regular.ttf
assets:
- assets/exit_icon.png
这里family是我们自定义的,对应该字体,这里每个字体可以对应多个ttf文件,比如区分加粗:
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中使用即可
Text(
"test",
style: TextStyle(fontFamily: "Rock Salt",),
)
全局字体
想设置全局字体,则需要在App中设置,如下:
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)。但是在TextSpan的源码中,发现并没有这一步操作,所以设置的全局字体对它不起作用。
所以使用TextSpan的地方如果需要则必须单独设置字体。
关注公众号:BennuCTech,获取更多干货!
以上是关于Flutter入门:设置全局字体的主要内容,如果未能解决你的问题,请参考以下文章