Flutter中通过Text组件style参数设置textTheme不生效问题求助
Flutter中Text组件设置textTheme.bodyMedium不生效的问题解决
我尝试通过Text组件的style参数设置textTheme里的bodyMedium样式,代码如下:
Text('Hello Flutter',style: Theme.of(context).textTheme.bodyMedium)
但设置后样式并未生效,效果如下:
不设置style参数时文本能正常显示:
完整代码如下:
Widget build(BuildContext context) { final TextStyle defaultTextStyle = TextStyle(fontFamily: 'IranYekan'); return MaterialApp( debugShowCheckedModeBanner: false, title: 'Flutter Demo', theme: ThemeData( textTheme: TextTheme( bodyMedium: defaultTextStyle.copyWith(fontWeight: FontWeight.w900, fontSize: 50), bodySmall: defaultTextStyle.copyWith(fontSize: 40), ), colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), useMaterial3: true, ), home: Scaffold( body: Center( child: Text('Hello Flutter',style: Theme.of(context).textTheme.bodyMedium)), ), ), ); }
问题原因
- 上下文获取错误:你在
build方法的上下文中调用Theme.of(context),但这个上下文是MaterialApp的父级上下文,还没有包含你自定义的主题配置。MaterialApp是当前build方法返回的组件,它的主题只对自己的子树生效,直接在home里用这个上下文拿不到自定义的textTheme。 - Material 3适配问题:开启
useMaterial3: true后,Flutter的文本样式系统有调整,直接设置TextTheme可能会被Material 3的默认样式覆盖。
解决方法
方法一:修复上下文问题(核心)
用Builder包裹Text所在的组件,获取MaterialApp子树的上下文:
home: Scaffold( body: Center( child: Builder( builder: (context) { return Text('Hello Flutter', style: Theme.of(context).textTheme.bodyMedium); }, ), ), ),
或者把home的内容抽成单独的组件:
class HomePage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( body: Center( child: Text('Hello Flutter', style: Theme.of(context).textTheme.bodyMedium), ), ); } } // 在MaterialApp中使用 home: HomePage(),
方法二:适配Material 3的文本样式配置(优化)
如果需要保留Material 3特性,推荐用typography来配置文本样式,更符合Material 3规范:
theme: ThemeData( typography: Typography.material2021( platform: TargetPlatform.android, ).copyWith( bodyMedium: defaultTextStyle.copyWith(fontWeight: FontWeight.w900, fontSize: 50), bodySmall: defaultTextStyle.copyWith(fontSize: 40), ), colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), useMaterial3: true, ),
验证
修复上下文问题后,自定义的bodyMedium样式会正常生效,文本将显示为50号字、900权重的IranYekan字体。
内容的提问来源于stack exchange,提问作者MehrdadMP
相关产品推荐
相关产品推荐

