Flutter-如何获取AppBar标题前景色

时间:2019-08-31 12:20:13

标签: flutter flutter-layout

我有一个Flutter应用程序,在appBar上,我添加了一个下拉按钮。我的应用程序支持主要/辅助颜色更改。 以下屏幕截图显示了两种不同原色的appBarenter image description here

如您所见,Flutter能够决定应用栏文字使用哪种颜色以保持适当的可读性-白色代表深色,黑色代表浅色(第二个应用栏)。 我想为Flutter应用栏文本使用的下拉菜单项的文本颜色设置相同,因此,我想检索它。 但是,查看Theme.of(context)属性并没有为我提供应该使用哪种颜色来实现所需功能的线索。

下面是代码段:

final ThemeData _theme = Theme.of(context);
final int index = values.indexWhere((TimeSpan element) => element.value == initialValue.value);
return Theme(
  data: _theme.copyWith(
    canvasColor: _theme.primaryColor,
    brightness: Brightness.dark,
  ),
  child: DropdownButtonHideUnderline(
    child: DropdownButton<TimeSpan>(
      items: values
          .map(
            (value) => DropdownMenuItem(
              child: Text(
                value.toString(),
                style: TextStyle(color: _theme.colorScheme.surface),
              ),
              value: value,
            ),
          )
          .toList(),
      onChanged: callback,
      isExpanded: false,
      value: values[index],
    ),
  ),
);

2 个答案:

答案 0 :(得分:0)

在使用明/暗主题亮度工作几天后,我想出了一种针对上述情况的(可能)解决方案。 您可以通过现有文本主题之一获得所需的文本颜色,例如Theme.of(context).primaryTextTheme.title.color返回调整为当前主题亮度的颜色。

答案 1 :(得分:-1)

Flutter会根据其最终的主题值来呈现窗口小部件。

因此,例如,如果子窗口小部件具有不同的主题,而父窗口小部件具有不同的主题,则Flutter的渲染引擎将优先于子窗口小部件的主题而不是父窗口小部件的主题。

因此DropdownButton的主题默认情况下是经过硬编码的,因此无法直接更改,因为该窗口小部件不接受任何参数来更改基础窗口小部件的主题,因此,父窗口小部件的主题赢得了胜利不能更改/更改DropdownButton的主题。这就是在两种情况下“星期”文本都保持黑色的原因。

如果您确实要更改主题,则可以更改DropDownButton的源代码或为其创建自定义窗口小部件。但是,只需对文本颜色的值进行硬编码就可以完成工作。

要更改Appbar的文本颜色,您将必须手动更改文本颜色,因为父主题建议文本颜色应为白色,而您希望它为黑色(根据您的要求)。

Scaffold(
appBar: AppBar(
  title: Text("Weight Overview",color: Colors.black)
  )
[...]
)

应OP的要求,

您可以通过使用Theme小部件并为其提供theme来在小部件树的任何位置手动更改子主题。

解决方案代码:

Scaffold(
appBar: AppBar(
    title: Theme(
    theme: ThemeData(primaryColor: Colors.black),
    child: Text("Weight Overview",),
        ),
  ),
[...]
)