Flutter系统字体访问插件system_fonts的使用

发布于 1周前 作者 yibo5220 来自 Flutter

Flutter系统字体访问插件system_fonts的使用

system_fonts 是一个Flutter插件,允许用户在Windows、MacOS和Linux平台上轻松加载系统字体。

特性

  • 在Flutter应用程序中动态加载系统字体。
  • 支持Windows、MacOS和Linux平台。
  • 支持ttf和otf字体格式。
  • 提供简单的API来加载和使用系统字体。

安装

  1. 在您的 pubspec.yaml 文件的 dependencies 部分添加以下行:
dependencies:
    system_fonts: ^VERSION

请将 ^VERSION 替换为最新版本号。您可以通过运行 flutter pub outdated 查看最新版本。

使用

加载单个字体

字体家族名称是系统中的字体文件名,不包括扩展名。例如,要将Text小部件的字体家族更改为 arial(arial.ttf),可以使用 loadFont(String fontName) 方法并传入参数 arial。此函数将加载系统中的 arial.ttf 文件并返回字体家族名称。

import 'package:flutter/material.dart';
import 'package:system_fonts/system_fonts.dart';

class Example extends StatefulWidget {
  const Example({super.key});

  @override
  State<Example> createState() => _ExampleState();
}

class _ExampleState extends State<Example> {
  String fontFamily = '';

  @override
  void initState() {
    super.initState();
    SystemFonts().loadFont('arial').then((value) {
      setState(() {
        fontFamily = value.toString();
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Text('this text will use arial font', style: TextStyle(fontFamily: fontFamily));
  }
}

加载所有字体

您可以使用 loadAllFonts() 方法加载系统上的所有字体,该方法返回所有可用的字体家族名称,然后您可以在任何小部件中使用这些字体。

指定字体文件夹

您可以使用 addAdditionalFontDirectory(String path) 方法指定一个字体文件夹,加载该文件夹中的所有字体,并在Flutter中使用它们。

从完整路径加载字体

您可以使用 loadFontFromPath(String path) 方法从完整路径加载任何字体。

列出所有可用字体

您可以使用 getFontList() 方法列出所有可用的字体家族名称。

使用 SystemFontSelector 小部件

SystemFontSelector 小部件用于列出和选择字体。以下是一个示例应用,展示了如何使用它。

import 'package:flutter/material.dart';
import 'package:system_fonts/system_fonts.dart';

void main() {
  runApp(const MainApp());
}

class MainApp extends StatefulWidget {
  const MainApp({super.key});

  @override
  State<MainApp> createState() => _MainAppState();
}

class _MainAppState extends State<MainApp> {
  String selectedFont = 'NONE';

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              SystemFontSelector(
                onFontSelected: (p0) => setState(() {
                  selectedFont = p0;
                }),
              ),
              Padding(
                padding: const EdgeInsets.symmetric(vertical: 30, horizontal: 60),
                child: Wrap(
                  alignment: WrapAlignment.center,
                  children: [
                    Text(
                      'Selected font is <$selectedFont> and here how it looks with ',
                      style: Theme.of(context).textTheme.headlineLarge?.copyWith(fontFamily: selectedFont),
                    ),
                    Text(
                      'BOLD, ',
                      style: Theme.of(context)
                          .textTheme
                          .headlineLarge
                          ?.copyWith(fontFamily: selectedFont, fontWeight: FontWeight.bold),
                    ),
                    Text(
                      'ITALIC, ',
                      style: Theme.of(context)
                          .textTheme
                          .headlineLarge
                          ?.copyWith(fontFamily: selectedFont, fontStyle: FontStyle.italic),
                    ),
                    Text(
                      'AND COLOR',
                      style: Theme.of(context).textTheme.headlineLarge?.copyWith(
                            fontFamily: selectedFont,
                            color: Colors.blue,
                          ),
                    ),
                    Text(
                      ' attributes.',
                      style: Theme.of(context).textTheme.headlineLarge?.copyWith(fontFamily: selectedFont),
                    ),
                  ],
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

许可证

此包遵循MIT许可证。详情请参阅 LICENSE 文件。


更多关于Flutter系统字体访问插件system_fonts的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter系统字体访问插件system_fonts的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter应用中使用system_fonts插件来访问系统字体的代码示例。这个插件允许你列出并使用设备上可用的系统字体。

首先,你需要在你的pubspec.yaml文件中添加system_fonts依赖项:

dependencies:
  flutter:
    sdk: flutter
  system_fonts: ^x.y.z  # 请使用最新版本号替换x.y.z

然后,运行flutter pub get来安装依赖项。

安装完成后,你可以在你的Flutter应用中使用以下代码来访问系统字体:

import 'package:flutter/material.dart';
import 'package:system_fonts/system_fonts.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'System Fonts Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: SystemFontsScreen(),
    );
  }
}

class SystemFontsScreen extends StatefulWidget {
  @override
  _SystemFontsScreenState createState() => _SystemFontsScreenState();
}

class _SystemFontsScreenState extends State<SystemFontsScreen> {
  List<String> _systemFonts = [];

  @override
  void initState() {
    super.initState();
    _getSystemFonts();
  }

  Future<void> _getSystemFonts() async {
    try {
      List<SystemFontFamily> fontFamilies = await SystemFonts.list();
      setState(() {
        _systemFonts = fontFamilies.map((family) => family.name).toList();
      });
    } catch (e) {
      print('Error fetching system fonts: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('System Fonts'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: _systemFonts.isEmpty
            ? Center(child: CircularProgressIndicator())
            : ListView.builder(
                itemCount: _systemFonts.length,
                itemBuilder: (context, index) {
                  String fontName = _systemFonts[index];
                  return Card(
                    child: ListTile(
                      title: Text(
                        fontName,
                        style: TextStyle(fontFamily: fontName),
                      ),
                      onTap: () {
                        // 你可以在这里添加点击字体的处理逻辑
                        // 例如,展示使用该字体的文本
                        showDialog(
                          context: context,
                          builder: (context) => AlertDialog(
                            title: Text('Font Preview'),
                            content: Text(
                              'This is a sample text in $fontName font.',
                              style: TextStyle(fontFamily: fontName),
                            ),
                          ),
                        );
                      },
                    ),
                  );
                }),
      ),
    );
  }
}

在这个示例中,我们创建了一个Flutter应用,它使用system_fonts插件列出设备上的所有系统字体,并在UI中展示这些字体。当你点击一个字体时,会弹出一个对话框,显示使用该字体的文本。

请确保你已经正确安装了system_fonts插件,并且使用的是最新版本。此外,由于字体列表可能因设备而异,因此实际可用的字体可能会有所不同。

回到顶部