使用自定义字体
尽管 Android 和 iOS 提供了高质量的系统字体,但设计师仍然希望支持自定义字体。你可能拥有设计师定制的字体,或者你可能从Google Fonts下载了字体。
字型是构成特定书写风格的一组字形或形状。字体是在给定粗细或变体下的字型的一种表现形式。Roboto 是一种字型,Roboto Bold 是一种字体。
Flutter 允许你将自定义字体应用于整个应用或单个 Widget。此方法创建一个使用自定义字体的应用,步骤如下:
- 选择你的字体。
- 导入字体文件。
- 在 pubspec.yaml 中声明字体。
- 将字体设置为默认字体。
- 在特定 Widget 中使用字体。
你不需要按顺序完成每个步骤。本指南在最后提供了完整的示例文件。
选择字体
#你的字体选择不应该仅仅是个人偏好。考虑哪些文件格式与 Flutter 兼容,以及字体如何影响设计选项和应用性能。
选择受支持的字体格式
#Flutter 支持以下字体格式:
- OpenType 字体集合:
.ttc
- TrueType 字体:
.ttf
- OpenType 字体:
.otf
Flutter 不支持桌面平台上的 Web Open Font Format 字体(.woff
和 .woff2
)。
选择具有特定优势的字体
#很少有资料一致地说明字体文件类型是什么,或者哪种类型占用空间更少。字体文件类型之间的主要区别在于格式如何编码文件中的字形。大多数 TrueType 和 OpenType 字体文件具有相似的功能,因为随着时间的推移,格式和字体的改进,它们相互借鉴。
你应该使用哪种字体取决于以下考虑因素:
- 你的应用中需要多少字体变体?
- 你的应用可以接受使用多大尺寸的字体文件?
- 你的应用需要支持多少种语言?
研究给定字体提供的选项,例如每个字体文件有多种粗细或样式,可变字体,多种字体粗细的多个字体文件的可用性,或每个字体有多种宽度。
选择满足应用设计需求的字型或字体系列。
导入字体文件
#要使用字体,请将它的字体文件导入你的 Flutter 项目。
要导入字体文件,请执行以下步骤:
如果需要,为了匹配本指南中的其余步骤,请将你的 Flutter 应用名称更改为
custom_fonts
。mv /path/to/my_app /path/to/custom_fonts
导航到 Flutter 项目的根目录。
cd /path/to/custom_fonts
在 Flutter 项目的根目录下创建一个
fonts
目录。mkdir fonts
将字体文件移动或复制到 Flutter 项目根目录下的
fonts
或assets
文件夹中。cp ~/Downloads/*.ttf ./fonts
生成的文件夹结构应类似于以下内容:
custom_fonts/
|- fonts/
|- Raleway-Regular.ttf
|- Raleway-Italic.ttf
|- RobotoMono-Regular.ttf
|- RobotoMono-Bold.ttf
在 pubspec.yaml 文件中声明字体
#下载字体后,在 pubspec.yaml
文件中包含字体定义。此字体定义还指定应使用哪个字体文件来呈现应用中给定的粗细或样式。
在 pubspec.yaml
文件中定义字体
#要将字体文件添加到 Flutter 应用中,请完成以下步骤:
打开 Flutter 项目根目录下的
pubspec.yaml
文件。vi pubspec.yaml
将以下 YAML 块粘贴到
flutter
声明之后。yamlfonts: - family: Raleway fonts: - asset: fonts/Raleway-Regular.ttf - asset: fonts/Raleway-Italic.ttf style: italic - family: RobotoMono fonts: - asset: fonts/RobotoMono-Regular.ttf - asset: fonts/RobotoMono-Bold.ttf weight: 700
此 pubspec.yaml
文件将 Raleway
字体系列的斜体样式定义为 Raleway-Italic.ttf
字体文件。当设置 style: TextStyle(fontStyle: FontStyle.italic)
时,Flutter 将 Raleway-Regular
与 Raleway-Italic
交换。
family
值设置字型的名称。你在 TextStyle
对象的 fontFamily
属性中使用此名称。
asset
的值是从 pubspec.yaml
文件到字体文件的相对路径。这些文件包含字体中字形的轮廓。构建应用时,Flutter 将这些文件包含在应用的资产包中。
为每个字体包含字体文件
#不同的字型以不同的方式实现字体文件。如果需要具有各种字体粗细和样式的字型,请选择并导入代表该变体的字体文件。
当你导入一个不包含多个字体或可变字体功能的字体文件时,不要使用 style
或 weight
属性来调整它们的显示方式。如果你在常规字体文件中使用这些属性,Flutter 会尝试_模拟_外观。视觉效果将与使用正确的字体文件大相径庭。
使用字体文件设置样式和粗细
#声明哪些字体文件代表字体的样式或粗细时,可以使用 style
或 weight
属性。
设置字体粗细
#weight
属性将文件中轮廓的粗细指定为 100 的整数倍,介于 100 和 900 之间。这些值对应于 FontWeight
,并且可以在 TextStyle
对象的 fontWeight 属性 中使用。
在本指南中显示的 pubspec.yaml
中,你将 RobotoMono-Bold
定义为字体系列的 700
粗细。要使用添加到应用中的 RobotoMono-Bold
字体,请在 TextStyle
Widget 中将 fontWeight
设置为 FontWeight.w700
。
如果你没有将 RobotoMono-Bold
添加到你的应用中,Flutter 会尝试使字体看起来更粗。然后文本可能看起来稍微深一些。
你不能使用 weight
属性来覆盖字体的粗细。你不能将 RobotoMono-Bold
设置为除 700
之外的任何其他粗细。如果你设置 TextStyle(fontFamily: 'RobotoMono', fontWeight: FontWeight.w900)
,则显示的字体仍然会呈现为 RobotoMono-Bold
的粗细。
设置字体样式
#style
属性指定字体文件中的字形是否显示为 italic
或 normal
。这些值对应于 FontStyle
。你可以在 TextStyle
对象的 fontStyle 属性 中使用这些样式。
在本指南中显示的 pubspec.yaml
中,你将 Raleway-Italic
定义为 italic
样式。要使用添加到应用中的 Raleway-Italic
字体,请设置 style: TextStyle(fontStyle: FontStyle.italic)
。渲染时,Flutter 将 Raleway-Regular
与 Raleway-Italic
交换。
如果你没有将 Raleway-Italic
添加到你的应用中,Flutter 会尝试使字体看起来_斜体_。然后文本可能看起来向右倾斜。
你不能使用 style
属性来覆盖字体的字形。如果你设置 TextStyle(fontFamily: 'Raleway', fontStyle: FontStyle.normal)
,则显示的字体仍然会呈现为斜体。斜体字体的 regular
样式_是_斜体。
将字体设置为默认字体
#要将字体应用于文本,可以将其设置为应用在其 theme
中的默认字体。
要设置默认字体,请在应用的 theme
中设置 fontFamily
属性。使 fontFamily
值与 pubspec.yaml
文件中声明的 family
名称匹配。
结果将类似于以下代码:
return MaterialApp(
title: 'Custom Fonts',
// Set Raleway as the default app font.
theme: ThemeData(fontFamily: 'Raleway'),
home: const MyHomePage(),
);
要了解有关主题的更多信息,请查看使用主题共享颜色和字体样式 方法。
在特定 Widget 中设置字体
#要将字体应用于特定 Widget(例如 Text
Widget),请向 Widget 提供一个 TextStyle
。
对于本指南,尝试将 RobotoMono
字体应用于单个 Text
Widget。使 fontFamily
值与 pubspec.yaml
文件中声明的 family
名称匹配。
结果将类似于以下代码:
child: Text(
'Roboto Mono sample',
style: TextStyle(fontFamily: 'RobotoMono'),
),
尝试完整的示例
#下载字体
#从Google Fonts下载 Raleway 和 RobotoMono 字体文件。
更新 pubspec.yaml
文件
#打开 Flutter 项目根目录下的
pubspec.yaml
文件。vi pubspec.yaml
将其内容替换为以下 YAML。
yamlname: custom_fonts description: An example of how to use custom fonts with Flutter dependencies: flutter: sdk: flutter dev_dependencies: flutter_test: sdk: flutter flutter: fonts: - family: Raleway fonts: - asset: fonts/Raleway-Regular.ttf - asset: fonts/Raleway-Italic.ttf style: italic - family: RobotoMono fonts: - asset: fonts/RobotoMono-Regular.ttf - asset: fonts/RobotoMono-Bold.ttf weight: 700 uses-material-design: true
使用此 main.dart
文件
#打开 Flutter 项目
lib/
目录中的main.dart
文件。vi lib/main.dart
将其内容替换为以下 Dart 代码。
dartimport 'package:flutter/material.dart'; void main() => runApp(const MyApp()); class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( title: 'Custom Fonts', // Set Raleway as the default app font. theme: ThemeData(fontFamily: 'Raleway'), home: const MyHomePage(), ); } } class MyHomePage extends StatelessWidget { const MyHomePage({super.key}); @override Widget build(BuildContext context) { return Scaffold( // The AppBar uses the app-default Raleway font. appBar: AppBar(title: const Text('Custom Fonts')), body: const Center( // This Text widget uses the RobotoMono font. child: Text( 'Roboto Mono sample', style: TextStyle(fontFamily: 'RobotoMono'), ), ), ); } }
最终的 Flutter 应用应该显示以下屏幕:
除非另有说明,否则本网站上的文档反映的是 Flutter 的最新稳定版本。页面最后更新于 2025-01-30。 查看源代码 或 报告问题。