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

Ral*_*ann 4 dart flutter

我创建了友好聊天应用程序,并希望添加一个不同主题的新屏幕,但它不起作用:-(

整个应用程序有一个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,
);
Run Code Online (Sandbox Code Playgroud)

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

Map results = await Navigator.of(context).pushNamed(SettingsScreen.PATH);
Run Code Online (Sandbox Code Playgroud)

在设置屏幕中我改变了AppBar's backgroundColor,brightness但新/不同brightness没有效果(改变backgroundColor作品)

class SettingsScreen extends StatefulWidget {

  @override
  State createState() => new SettingsScreenState();
}

class SettingsScreenState extends State<SettingsScreen> {

  @override
  Widget build(BuildContext context) {
    return new WillPopScope(
      onWillPop: _onWillPop,
      child: new Scaffold(
        appBar: new AppBar(
          title: new Text("Settings"),
          backgroundColor: Colors.amberAccent[700],
          brightness: Brightness.light,
        ),
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

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

编辑

最后我想要:

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

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

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

Rém*_*let 11

您可以通过在包装所需的小部件覆盖当前主题的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;
}
Run Code Online (Sandbox Code Playgroud)

不得不做一个自定义类,因为Scaffold需要一个PreferredSizeWidget.

编辑

要回答你的"奖励点",这很简单.

而不是包裹AppBar在一个Theme,Scaffold而不是包裹.