如何为屏幕设置不同的主题?

时间:2018-01-24 13:48:44

标签: dart flutter

我创建了Friendly Chat app并希望添加一个不同主题的新屏幕,但它不起作用: - (

整个应用都有一个private string GetSuffix(string input) { var suffix = PropStreetSuffixDict.FirstOrDefault(kvp => input.Containts(kvp.Key.Trim(), StringComparison.CurrentCultureIgnoreCase))?.Value; return suffix ?? string.Empty; } 主题:

Brightness.dark

当用户点击按钮时,我按下设置屏幕:

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    print("build MaterialApp");
    return new MaterialApp(
      title: 'Friendly Chat',
      theme: kTheme,
      home: new ChatScreen(),
      routes: <String, WidgetBuilder>{
        SettingsScreen.PATH: (BuildContext context) => new SettingsScreen()
      },
    );
  }
}

final ThemeData kTheme = new ThemeData(
  primarySwatch: Colors.indigo,
  primaryColor: Colors.indigoAccent[100],
  primaryColorBrightness: Brightness.dark,
);

在设置屏幕中,我更改了Map results = await Navigator.of(context).pushNamed(SettingsScreen.PATH); 的{​​{1}}和AppBar,但新的/不同的backgroundColor无效(更改brightness的工作)

brightness

如何将设置屏幕AppBar主题更改为轻量级主题?

修改

最后我要:

  • 所有屏幕都有一个黑色的AppBar背景色,带有白色标题和图标

  • 设置屏幕(仅限)具有浅色标题和图标的AppBar背景颜色

加分:如何为整个屏幕设置不同的主题,而不仅仅是AppBar

1 个答案:

答案 0 :(得分:7)

您可以通过在Theme小部件

中包装所需的小部件来覆盖当前主题

通常,您会遇到与以下内容相似的内容:

class CustomAppBar extends StatelessWidget implements PreferredSizeWidget {
  final AppBar appBar;

  CustomAppBar(): appBar = new AppBar();

  @override
  Widget build(BuildContext context) {
    return new Theme(
      child: appBar,
      data: new ThemeData.dark()
    );
  }

  @override
  Size get preferredSize => appBar.preferredSize;
}

由于Scaffold需要PreferredSizeWidget

,因此必须制作自定义课程

修改

为了回答你的#34;奖励点&#34;,这很简单。

而不是将AppBar包裹在Theme中,而是包裹Scaffold