以 package 的方式使用字型

自定義字型,除了可以把字型檔作為應用的一部分之外,還可以透過 package 的方式使用,這樣有助於跨專案的字型共享,也可以更方便的發布到 pub.dev

步驟

  1. 將字型新增到 package

  2. 將 package 和字型新增到應用

  3. 使用字型

1. 將字型新增到 package

透過 package 的方式使用字型,需要將字型檔匯入 package 專案的 lib 資料夾中。你既可以將字型檔直接放在 lib 資料夾中,也可以放在子目錄中,例如 lib/fonts

在此範例中,假設你已有一個名為 awesome_package 的 library,其中包含了 lib/fonts 資料夾中的字型資源。

awesome_package/
  lib/
    awesome_package.dart
    fonts/
      Raleway-Regular.ttf
      Raleway-Italic.ttf

2. 將 package 和字型新增到應用

現在你可以使用該 package 以及它提供的字型。我們來編輯 應用程式 根目錄下的 pubspec.yaml 檔案。

將 package 新增到應用中

執行 flutter pub addawesome_package 新增為依賴。

$ flutter pub add awesome_package

宣告字型資源

現在已經匯入了 package,你需要告之 Flutter 在 awesome_package 中的哪裡可以找到字型檔。

要想宣告 package 中的字型,必須在 packages/awesome_package 的路徑前加上字型宣告。這將會讓 Flutter 檢索到 lib package 的資料夾中的字型。

flutter:
  fonts:
    - family: Raleway
      fonts:
        - asset: packages/awesome_package/fonts/Raleway-Regular.ttf
        - asset: packages/awesome_package/fonts/Raleway-Italic.ttf
          style: italic

3. 使用字型

你可以使用 TextStyle 來更改文字的外觀。在使用 package 中的字型時,你不僅需要宣告該文字所要使用的字型,還需要宣告字型所屬的 package

child: Text(
  'Using the Raleway font from the awesome_package',
  style: TextStyle(
    fontFamily: 'Raleway',
  ),
),

完整範例

字型

這裡所使用的 Raleway 和 RobotoMono 字型都是從 Google Fonts 下載的。

pubspec.yaml

name: package_fonts
description: An example of how to use package fonts with Flutter

dependencies:
  awesome_package:
  flutter:
    sdk: flutter

dev_dependencies:
  flutter_test:
    sdk: flutter

flutter:
  fonts:
    - family: Raleway
      fonts:
        - asset: packages/awesome_package/fonts/Raleway-Regular.ttf
        - asset: packages/awesome_package/fonts/Raleway-Italic.ttf
          style: italic
  uses-material-design: true

main.dart

import 'package:flutter/material.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: 'Package Fonts',
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  const MyHomePage({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      // The AppBar uses the app-default font.
      appBar: AppBar(title: const Text('Package Fonts')),
      body: const Center(
        // This Text widget uses the Raleway font.
        child: Text(
          'Using the Raleway font from the awesome_package',
          style: TextStyle(
            fontFamily: 'Raleway',
          ),
        ),
      ),
    );
  }
}

Package Fonts Demo