如何在颤动中覆盖 MaterialApp 的主题

Posted

技术标签:

【中文标题】如何在颤动中覆盖 MaterialApp 的主题【英文标题】:How to override MaterialApp's theme in flutter 【发布时间】:2021-04-08 15:17:50 【问题描述】:

我正在尝试使用 Theme 小部件来覆盖特定容器的主题样式。

在这里,我将所有文本小部件的正文文本颜色设置为白色。

class MyApp extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
    return MaterialApp(
      theme: ThemeData(
        textTheme: TextTheme(
          bodyText2: TextStyle(
            color: Colors.white
          )
        )
      ),
      initialRoute: Home.id,
      routes: 
        Home.id: (context) => Home()
      ,
    );
  

现在我正在尝试将此容器内的所有文本小部件设置为黑色,但它仍在获取 Material 应用小部件中设置的白色。

class NewTask extends StatelessWidget 
      @override
      Widget build(BuildContext context) 
        return GestureDetector(
          onTap: ()
            Navigator.pop(context);
          ,
          child: Theme(
            data: ThemeData(
                textTheme: TextTheme(
                    bodyText2: TextStyle(
                        color: Colors.black,
                    )
                )
            ),
            child: Container(
              child: Column(
                children: [
                  Text(
                    "New Task",
                  )
                ],
              ),
            ),
          )
        );
      
    

我能够通过将 Container 小部件包装在 Builder 方法中并设置来使其工作

TextStyle(
color: Theme.of(context).textTheme.bodyText2.color
),

但是如果我在这个容器中有多个文本小部件,这似乎需要做很多工作,我不明白出了什么问题,或者这不是主题小部件应该如何工作。

谢谢

【问题讨论】:

【参考方案1】:

来自包含给定上下文的最近主题实例的数据。

Theme class docs

当您调用Theme.of(context) 时,您指的是NewTask.build 的上下文。与此上下文关联的Theme 对象将是MaterialApp.theme。因此,要使用Theme 小部件提供的ThemeData,您可以使用Builder 或将Theme 及其后代提取到新的StatelessWidget,或者如果需要,StatefulWidget

Builder 小部件本质上将其后代包装在 StatelessWidget 中,并提供 build 方法作为回调。

【讨论】:

我知道我可以将容器包装在 Builder 小部件中,并且上下文会改变。然后我可以使用 TextStyle 小部件手动设置颜色,颜色属性值为 Theme.of(context).textTheme.bodyText2.color 。这工作正常。但为什么我必须这样做?我已经将我的容器包装在 Theme 小部件中,并且文本小部件应该会自动获取在 Theme 小部件中设置的颜色值。

以上是关于如何在颤动中覆盖 MaterialApp 的主题的主要内容,如果未能解决你的问题,请参考以下文章

在嵌套的 MaterialApp 中显示对话框 - 颤动

如何在颤动中设置背景图像?

如何在颤动中添加主题切换动画?

如何在颤动中为整个应用程序设置文本颜色主题

如何根据设置的主题更改颤动中的状态栏图标和文本颜色?

如何在颤动中显示具有顶部和底部渐变阴影的图像?