我创建了
Friendly Chat app,并希望添加一个不同主题的新屏幕,但它不起作用:-(
整个应用程序有一个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,);@H_403_14@当用户单击按钮时,我按下设置屏幕:
Map results = await Navigator.of(context).pushNamed(SettingsScreen.PATH);@H_403_14@在设置屏幕中,我更改了AppBar的backgroundColor和亮度但新的/不同的亮度没有效果(更改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,),); } }@H_403_14@编辑
最后我想要:
>所有屏幕都有一个黑色的AppBar背景色,带有白色标题和图标
>设置屏幕(仅限)具有浅色标题和图标的AppBar背景颜色加分:如何为整个屏幕设置不同的主题,而不仅仅是AppBar
解决方法
您可以通过在
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; }@H_403_14@必须创建一个自定义类,因为Scaffold需要一个PreferredSizeWidget.
编辑
要回答你的“奖励点”,这很简单.
而不是将AppBar包装在主题中,而是包裹Scaffold.