Flutter 分配 Theme 文本样式

Posted

技术标签:

【中文标题】Flutter 分配 Theme 文本样式【英文标题】:Flutter assign Theme text style 【发布时间】:2021-10-26 00:41:17 【问题描述】:

我想知道有没有比这种方法更好的方法来将我的主题的某种默认文本样式分配给 Text 小部件。

Text(
 'Hello world',
  style: Theme.of(context).textTheme.headline1,
),

我确实认为应该有类似单独的小部件或文本方法 Text.headline1 或简单的样式命令样式:TextStyle.headline1。

但似乎我必须通过 Theme.of(context) 才能得到这个。

谁有更好的解决方案?

【问题讨论】:

【参考方案1】:

你可以直接使用TextStyle:

Text(
 'Hello world',
  style: TextStyle(color: Colors.black, fontSize: 15.0), // Etc...
),

【讨论】:

嗨鲍里斯,这并不反映我可能交换主题的意图。谢谢你的回复。【参考方案2】:

Theme.of(context) 是一个很好的选择,原因有很多,比如在浅色和深色主题之间切换。我喜欢为主题和文本主题创建一个变量,以保持简洁高效。

Widget build(BuildContext context) 
  final theme = Theme.of(context);
  final textTheme = theme.textTheme;

  return Column(
    children: [
      Text('Heading Text', style: textTheme.headline1),
      Text('Caption Text', style: textTheme.caption),
      Text('Body text...', style: textTheme.bodyText1),
    ],
  );

【讨论】:

谢谢,Jared,我也考虑过创建一个变量。然而,它仍然是涉及上下文的相同方法,如果没有全局定义,您可能想要使用它的每个类仍然需要它。【参考方案3】:

Theme.of 返回为最近的BuildContext 祖先指定的ThemeData 值。如果您不使用它,那么您将无法访问您可能设置的主题配置并受益于它的优势。

但是,您可以创建一个名为 Styles 的类,您可以在其中访问预定义的颜色、文本样式等:

class Styles 
  static const Color primaryColor = Colors.blue;

  static const TextStyle headline1 = TextStyle(
    fontSize: 20.0,
    fontWeight: FontWeight.bold,
  );

  static const TextStyle bodyText1 = TextStyle(
    fontSize: 16.0,
    fontWeight: FontWeight.normal,
  );

这是一个使用它的例子:

Text(
  'Hello world',
  style: Styles.headline1,
)

【讨论】:

这需要为已定义的主题中的现有参数定义一个额外的样式,因此如果我想交换主题,会产生额外的维护工作。

以上是关于Flutter 分配 Theme 文本样式的主要内容,如果未能解决你的问题,请参考以下文章

flutter theme 主题样式生成工具

如何在 Flutter 中更改整个主题的文本颜色?

Flutter 基础组件:文本字体样式

flutter学习二:资源文件images

Flutter:使用 TapGestureRecognizer 更改 TextSpan 的文本样式

在 TextFormField 中检测新行 - Flutter