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

时间:2021-01-02 02:03:38

标签: flutter material-design themes

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

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

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 个答案:

答案 0 :(得分:0)

<块引用>

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

Theme class docs

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

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