我创建了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,
);

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

Map results = await Navigator.of(context).pushNamed(SettingsScreen.PATH);

在设置屏幕中,我更改了AppBarbackgroundColorbrightness,但新的/不同的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,
        ),
      ),
    );
  }
}

如何将设置屏幕AppBar主题更改为浅色主题?

EDIT

最后我想:

  • 所有屏幕均采用深色AppBar背景色,标题和图标均为白色

  • 设置屏幕(仅限)有一个浅AppBar背景色,带有深色标题和图标

Bonus points:如何为整个屏幕设置不同的主题,而不仅仅是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;
}

我不得不定制一个类,因为Scaffold需要PreferredSizeWidget.

EDIT

要回答你的"加分",非常简单.

不是用Theme包装AppBar,而是用Scaffold包装.

Dart相关问答推荐

Flutter - 对 Cloud Firestore 进行排序

AppLifcycleState.didChangeLifecycleState( ) 函数在应用程序进入前台或后台时不被调用

日期时间时区反序列化

Flutter:Firebase 基本查询或基本搜索代码

运行时出现Flutter错误:Error waiting for a debug connection: Bad state: No element

如何在没有 Scaffold.drawer 的情况下使用 Drawer?

替换 Flutter 中的片段等小部件

在Flatter中滚动列表视图时,网络图像一直消失?

访问用户环境变量

如何在Flutter应用程序中使用套接字?

用于名称和数字省道的正则表达式

在字符串中查找字母 (charAt)

在 Flutter 的 TextFormField 中管理事件

dart 如何创建、监听和发出自定义事件?

有 Javascript 到 Dart 的转换器吗?

如何在 Dart 中以正确的方式重定向和重新加载?

在dart中获取列表的最后一个元素

dart中 library关键字的确切含义

将`_`(即下划线)作为唯一参数传递给 Dart 语言函数是什么意思?

你如何在 Dart 中构建一个单例?