Flutter使用Google Fonts时退出重启报MissingPluginException错误如何解决?
问题原因
该报错出现在应用从后台恢复(未杀死进程)场景下,是由于你在全局ThemeData中直接调用GoogleFonts.dmSans().fontFamily时,GoogleFonts插件会触发路径访问逻辑,但此时Flutter平台通道尚未完成重新绑定,path_provider的原生实现未完成注册,因此抛出MissingPluginException。杀死进程后重启时平台通道初始化流程完整,所以运行正常。
解决方案
方案1(最推荐,性能最优):本地打包字体,关闭运行时下载
如果你不需要动态从谷歌服务器拉取字体,直接把字体文件打包到应用内,彻底避免触发路径访问逻辑:
- 下载DM Sans字体文件,放到项目
assets/fonts/目录下 - 在
pubspec.yaml中注册字体:
flutter: fonts: - family: DM Sans fonts: - asset: assets/fonts/DMSans-Regular.ttf - asset: assets/fonts/DMSans-Bold.ttf weight: 700 - asset: assets/fonts/DMSans-Italic.ttf style: italic
- 修改
main.dart代码:
void main() async { WidgetsFlutterBinding.ensureInitialized(); // 关闭GoogleFonts运行时拉取,彻底避免调用path_provider GoogleFonts.config.allowRuntimeFetching = false; setupLocator(); final bgColor = Color(0xfff5f5f5); runApp( MaterialApp( title: "App Name", darkTheme: ThemeData( primarySwatch: Colors.orange, primaryColorDark: Color(0xff444444), accentColor: Colors.orange, appBarTheme: AppBarTheme(backgroundColor: Colors.transparent, elevation: 0), brightness: Brightness.dark, // 直接使用注册的字体名 fontFamily: 'DM Sans', ), theme: ThemeData( primarySwatch: Colors.orange, primaryColorLight: Color(0xffffffff), scaffoldBackgroundColor: bgColor, appBarTheme: AppBarTheme(backgroundColor: bgColor, elevation: 0), brightness: Brightness.light, fontFamily: 'DM Sans', ), ), ); }
方案2:保留运行时拉取字体能力
如果确实需要动态拉取字体,调整字体加载时机,不要在全局Theme初始化时触发:
- 把ThemeData的生成逻辑移到首页面的StatefulWidget中,在
initState中异步加载字体完成后再赋值主题 - 或者使用
ThemeData的fontFamily动态取值,加载完成前使用系统默认字体兜底
其他排查点
- 检查
pubspec.yaml中path_provider和google_fonts版本是否为最新兼容版本,版本不匹配也会触发该问题 - 检查Android端
AndroidManifest.xml中MainActivity的android:launchMode配置,避免使用singleInstance,建议改为singleTop或standard
内容的提问来源于stack exchange,提问作者Hardik Ojha
相关产品推荐
相关产品推荐

