Flutter中文字体支持插件chinese_font_library的使用
Flutter中文字体支持插件chinese_font_library的使用
chinese_font_library
插件旨在优化Flutter应用中中文字体的跨平台渲染,提供多字重渲染和动态加载字体的功能。以下是该插件的详细介绍及完整示例代码。
Features
多字重的渲染
在不同平台上,默认情况下Flutter使用的系统字体多为西文字体,这导致了中文字体通常只能以normal或bold字重渲染,并且bold字重是通过计算得到的,而非原生的bold字重,影响了文本的观感。chinese_font_library
提供了.useSystemChineseFont()
方法来修改textStyle
、textTheme
或themeData
,以确保使用正确的中文字重。
-
修改
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
Roadmap
平台 | 状态 |
---|---|
iOS | ✔️ |
华为 鸿蒙 | ✔️ |
小米 miui | ✔️ |
macOS | ✔️ |
Windows | ✔️ |
Web html | ✔️ |
荣耀 | ✔️ |
Vivo | ✔️ |
Oppo | ✔️ |
Linux | ❌ |
Reference
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
更多关于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应用中,你可以通过以下步骤来使用这个插件:
-
导入插件:
在你的Dart文件中导入
chinese_font_library
:import 'package:chinese_font_library/chinese_font_library.dart';
-
初始化字体:
通常,你会在应用的根组件(例如
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
中调用是一个合适的地方。 -
运行应用:
现在你可以运行你的Flutter应用,应该会看到应用中正确显示中文字体。
请注意,chinese_font_library
插件的具体使用方式可能会根据其版本和API的变化而有所不同。因此,建议查看插件的官方文档和GitHub仓库以获取最新的使用指南和示例代码。如果插件提供了更详细的配置选项或额外的功能,你也可以根据需要进行调整和使用。