Flutter中文字体支持插件chinese_font_library的使用

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

Flutter中文字体支持插件chinese_font_library的使用

chinese_font_library 插件旨在优化Flutter应用中中文字体的跨平台渲染,提供多字重渲染和动态加载字体的功能。以下是该插件的详细介绍及完整示例代码。

Features

多字重的渲染

在不同平台上,默认情况下Flutter使用的系统字体多为西文字体,这导致了中文字体通常只能以normal或bold字重渲染,并且bold字重是通过计算得到的,而非原生的bold字重,影响了文本的观感。chinese_font_library 提供了.useSystemChineseFont()方法来修改textStyletextThemethemeData,以确保使用正确的中文字重。

  • 修改 textStyle:

    Text(
        '你好世界 hello world',
        style: TextStyle(fontWeight: FontWeight.w100).useSystemChineseFont(),
    )
    
  • 修改 textTheme:

    return MaterialApp(
        ...
        theme: Theme(
            data: ThemeData(
              textTheme: yourCustomTextTheme.useSystemChineseFont(),
            ),
        ),
        ...
    )
    
  • 修改 themeData:

    return MaterialApp(
        ...
        theme: Theme(
            data: yourCustomThemeData.useSystemChineseFont(),
        ),
        ...
    )
    

动态加载字体

对于想要使用自定义中文字体的开发者来说,由于中文字体文件通常较大,将其直接打包到应用安装包中并不是最佳选择。chinese_font_library 支持通过网络动态加载字体,仅需下载一次即可使用。

DynamicFont.url(
    fontFamily: 'CustomFontFromWeb',
    url: 'https://raw.githubusercontent.com/LastMonopoly/chinese_font_library/master/example/assets/SmileySans-Oblique.ttf',
).load()

Results

Font weights demo from multiple devices

Roadmap

平台 状态
iOS ✔️
华为 鸿蒙 ✔️
小米 miui ✔️
macOS ✔️
Windows ✔️
Web html ✔️
荣耀 ✔️
Vivo ✔️
Oppo ✔️
Linux

Reference

Flutter 小技巧之玩转字体渲染和问题修复

Contributions

LiTang0908 开发维护


示例代码

下面是一个完整的示例应用程序,演示如何使用chinese_font_library插件:

import 'dart:math';

import 'package:chinese_font_library/chinese_font_library.dart';
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';

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

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

  @override
  Widget build(BuildContext context) {
    final customFontFamily = "CustomFont${Random().nextInt(1000)}";

    return MaterialApp(
      debugShowCheckedModeBanner: false,
      theme: ThemeData.dark(useMaterial3: true),
      localizationsDelegates: const [
        ...GlobalMaterialLocalizations.delegates,
        GlobalWidgetsLocalizations.delegate,
      ],
      supportedLocales: const [
        Locale('zh', ''),
        Locale.fromSubtags(languageCode: 'zh', scriptCode: 'Hans'),
        Locale('en', ''),
      ],
      home: Scaffold(
        appBar: AppBar(
          leading: IconButton(
            onPressed: () async {
              final stopwatch = Stopwatch()..start();
              await DynamicFont.url(
                fontFamily: customFontFamily,
                url:
                    'https://raw.githubusercontent.com/LastMonopoly/chinese_font_library/master/example/assets/SmileySans-Oblique.ttf',
              ).load();
              stopwatch.stop();
              debugPrint(
                  "Font loading uses ${stopwatch.elapsedMilliseconds} ms");
            },
            icon: const Icon(Icons.download),
          ),
        ),
        body: Center(child: FontWeightDemo(fontFamily: customFontFamily)),
      ),
    );
  }
}

class FontWeightDemo extends StatelessWidget {
  final String? fontFamily;
  const FontWeightDemo({super.key, required this.fontFamily});

  @override
  Widget build(BuildContext context) {
    return ListView(
      padding: const EdgeInsets.symmetric(horizontal: 20),
      shrinkWrap: true,
      children: FontWeight.values
          .map(
            (weight) => FittedBox(
              child: Text(
                '你好世界 hello world',
                style: TextStyle(
                  fontFamily: fontFamily,
                  fontWeight: weight,
                ).useSystemChineseFont(),
              ),
            ),
          )
          .toList(),
    );
  }
}

此代码创建了一个简单的Flutter应用,展示了如何动态加载自定义字体,并通过不同的字重显示文本。点击AppBar上的图标可以触发字体的动态加载过程,并在控制台打印出加载所花费的时间。


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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用chinese_font_library插件来支持中文字体的示例代码。这个插件通常用于确保应用在不同设备上都能正确显示中文字体。

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

dependencies:
  flutter:
    sdk: flutter
  chinese_font_library: ^x.y.z  # 替换为最新版本号

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

接下来,在你的Flutter应用中,你可以通过以下步骤来使用这个插件:

  1. 导入插件

    在你的Dart文件中导入chinese_font_library

    import 'package:chinese_font_library/chinese_font_library.dart';
    
  2. 初始化字体

    通常,你会在应用的根组件(例如MyApp)的initState方法中进行字体的初始化。这里有一个示例:

    import 'package:flutter/material.dart';
    import 'package:chinese_font_library/chinese_font_library.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: MyHomePage(),
        );
      }
    }
    
    class MyHomePage extends StatefulWidget {
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      @override
      void initState() {
        super.initState();
    
        // 初始化中文字体
        ChineseFontLibrary.loadFonts();
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('中文字体支持示例'),
          ),
          body: Center(
            child: Text(
              '你好,世界!',
              style: TextStyle(fontSize: 24),
            ),
          ),
        );
      }
    }
    

    在这个示例中,ChineseFontLibrary.loadFonts()方法被调用来加载中文字体。这个方法通常只需要调用一次,因此在initState中调用是一个合适的地方。

  3. 运行应用

    现在你可以运行你的Flutter应用,应该会看到应用中正确显示中文字体。

请注意,chinese_font_library插件的具体使用方式可能会根据其版本和API的变化而有所不同。因此,建议查看插件的官方文档和GitHub仓库以获取最新的使用指南和示例代码。如果插件提供了更详细的配置选项或额外的功能,你也可以根据需要进行调整和使用。

回到顶部