FlutterのYoutubeチャンネルを見てたら、
便利なパッケージがあったので試してみたときの備忘録(*´ω`*)
使い方
とりあえずインストール。
$ fvm flutter pub add google_fonts $ fvm flutter pub get
アプリ全体のフォントを変える
ThemeDataのtextThemeに設定すればOK
import 'package:google_fonts/google_fonts.dart'; ... return MaterialApp( theme: _buildTheme(Brightness.dark), ); } ThemeData _buildTheme(brightness) { var baseTheme = ThemeData(brightness: brightness); return baseTheme.copyWith( textTheme: GoogleFonts.latoTextTheme(baseTheme.textTheme), ); }
GoogleFonts.<フォント名>TextTheme()
の形になってる。
一覧は、ソースのgoogle_fonts/lib/google_fonts.dart
あたり。
下の方にあるので、検索すると見つけやすい。
個別でフォントを変える
特定のテキストやWidgetだけフォントを変える場合は、
style
に設定すればOK
import 'package:google_fonts/google_fonts.dart'; Text( 'This is Google Fonts', style: GoogleFonts.lato(), ), // or Text( 'This is Google Fonts', style: GoogleFonts.lato( textStyle: TextStyle(color: Colors.blue, letterSpacing: .5), ), ), // or Text( 'This is Google Fonts', style: GoogleFonts.lato(textStyle: Theme.of(context).textTheme.headline4), ),
リリース時はassetsのフォントファイルを利用する
google_fonts
はネットワーク経由でフォントファイルを取得してくれる。
開発中はよいけど、本番時はアプリに含めてリリースしたい。
フォントファイルをassets
のgoogle_fonts
というフォルダを用意しておくと、
自動的にそちらを使ってくれる機能があるらしい。
やり方としては、
- https://fonts.google.com/ からフォントをダウンロード
- zipを展開して
static/
配下のttfファイルをコピー assets/google_fonts/
フォルダを作成して、コピーしたttfファイルを配置pubspec.yaml
にassets/google_fonts/
を追加
# ダウンロードしたNoto_Sans_JP.zipの展開後 Noto_Sans_JP/ ├── NotoSansJP-VariableFont_wght.ttf ├── OFL.txt ├── README.txt └── static ├── NotoSansJP-Black.ttf ├── NotoSansJP-Bold.ttf ├── NotoSansJP-ExtraBold.ttf ├── NotoSansJP-ExtraLight.ttf ├── NotoSansJP-Light.ttf ├── NotoSansJP-Medium.ttf ├── NotoSansJP-Regular.ttf ├── NotoSansJP-SemiBold.ttf └── NotoSansJP-Thin.ttf
# assets/google_fontsの中身 assets/google_fonts/ ├── NotoSansJP-Black.ttf ├── NotoSansJP-Bold.ttf ├── NotoSansJP-ExtraBold.ttf ├── NotoSansJP-ExtraLight.ttf ├── NotoSansJP-Light.ttf ├── NotoSansJP-Medium.ttf ├── NotoSansJP-Regular.ttf ├── NotoSansJP-SemiBold.ttf └── NotoSansJP-Thin.ttf
### pubspec.yaml # アセットとして認識されるようにフォルダを追加 assets: - assets/google_fonts/
これでassets/google_fonts
フォントファイルがあると、
そちらを使ってくれる。
このままだと、存在しないフォントの場合、ネットワークアクセスが発生するので、
GoogleFonts.config
でフォントの取得を無効化しておく。
この例ではkDebugMode
を使って、本番時のみ無効化している。
import 'package:flutter/foundation.dart'; import 'package:google_fonts/google_fonts.dart'; FutureOr<void> main() async { WidgetsFlutterBinding.ensureInitialized(); // google fontsの設定 GoogleFonts.config.allowRuntimeFetching = kDebugMode; // runApp runApp(const ProviderScope(child: App())); }
フォントの読み込みを待つ
Webの場合、HTMLとCanvasKitの2つのレンダラーが用意されている。
デフォルトのCanvasKitだと、フォントが読み込まれるまで、
日本語が豆腐になってしまう。。
flutter run -d chrome --web-renderer html
などで、
HTML rendererを利用して解決する方法をよく見るけど、
CanvasKitでもなんとかうまくしたい。。
google_fonts
にはfont swappingのために、
GoogleFonts.pendingFonts()
がよういされているっぽい。
- Visual font swapping | google_fonts | Flutter Package
- pendingFonts method - GoogleFonts class - google_fonts library - Dart API
これを使って、runApp()
の前にフォントを読み込むようにすると、
CanvasKitでも豆腐なく表示できるっぽい。
import 'package:google_fonts/google_fonts.dart'; FutureOr<void> main() async { WidgetsFlutterBinding.ensureInitialized(); // google fontsの設定 GoogleFonts.config.allowRuntimeFetching = kDebugMode; // Noto Sans JPの読み込みを待つ await GoogleFonts.pendingFonts([ GoogleFonts.notoSansJpTextTheme(), ]); // runApp runApp(const ProviderScope(child: App())); }
HTMLとCanvasKitの2つのレンダラーの違いは、
- HTML renderer
- CanvasKit renderer
- Flutter mobileとdesktopと同等の見た目
- Widget密度が高く、パフォーマンスが高速
- ダウンロードサイズが大きい
初期表示の時間を優先する場合はHTML、
見た目やパフォーマンスが優先の場合はCanvasKit、
にするのが良さそう。
以上!! カスタムフォントも簡単に試したり、導入できたりするようになった(*´ω`*)