在 Flutter 中添加自定义字体,FontWeight 不影响文本

Mus*_*riq 3 font-family dart flutter

image pubspec 我想设置Noir Pro为我的Flutter应用程序的默认字体系列。

默认 Roboto fontFamily 更改为 NoirPro,但字体粗细e.g(.w400,w500,w600)无法正常工作。我找不到任何其他在线帮助。这让我很沮丧

pubspec.yaml

fonts:
    - family: NoirPro
      fonts:
        - asset: resources/fonts/NoirPro_Light.ttf
          weight: 300
        - asset: resources/fonts/NoirPro_Normal.ttf
          weight: 400
        - asset: resources/fonts/NoirPro_Medium.ttf
          weight: 500
        - asset: resources/fonts/NoirPro_Bold.ttf
          weight: 700
        - asset: resources/fonts/NoirPro_Heavy.ttf
          weight: 800
Run Code Online (Sandbox Code Playgroud)

In main.dart

 theme: ThemeData(
          fontFamily: 'NoirPro',
          canvasColor: Colors.white,
        ),
Run Code Online (Sandbox Code Playgroud)

Mus*_*riq 5

我找到了原因,而且非常简单:

Flutter 根据字体本身的元数据匹配系列中的字体,而不是 pubspec.yaml 中声明的样式描述符。

我的 NoirPro、中等和粗体字体包含元数据,分别将它们的权重声明为 400、410 和 420。但是,Flutter 文本子系统仅支持代表 100 倍数的字体权重桶(https://api.flutter.dev/flutter/dart-ui/FontWeight-class.html)。所以所有这三种字体都映射到 FontWeight.w400,字体样式匹配器无法根据权重在这些字体之间进行选择。

(您可以使用此站点检查字体文件的元数据:https : //fontdrop.info/

在 pubspec.yaml 中将这些字体声明为不同的系列可以解决这个问题。

当前,请求的权重是根据字体本身定义的权重元数据选择的。pubspec.yaml 中的权重被忽略。

应该更新文档(说明书)以反映这一点,以免混淆其他开发人员。现在我的 pubspec.yaml 是:

fonts:
- family: NoirProNormal
  fonts:
    - asset: resources/fonts/NoirPro_Normal.ttf
- family: NoirProLight
  fonts:
    - asset: resources/fonts/NoirPro_Light.ttf
- family: NoirProMedium
  fonts:
    - asset: resources/fonts/NoirPro_Medium.ttf
- family: NoirProBold
  fonts:
    - asset: resources/fonts/NoirPro_Bold.ttf
- family: NoirProHeavy
  fonts:
    - asset: resources/fonts/NoirPro_Heavy.ttf
Run Code Online (Sandbox Code Playgroud)

当使用文本小部件时:

Text(
        "Hello World",
        style: TextStyle(
            fontSize: size.width * 0.075,
            fontFamily: "NoirProMedium",
            color: Colors.white)
      ),
Run Code Online (Sandbox Code Playgroud)