更改Flutter中DropdownMenuButton中焦点项目的文本颜色



下拉菜单中的重点项目以主题的强调色/次色突出显示(示例显示突出显示(。然而,如果高亮显示的颜色与背景的亮度不同,则文本不容易显示(参见前面的示例(,因此我只想更改重点项目的文本颜色。我尝试在主题的colorScheme中将onSecondary设置为对比色,但焦点下拉菜单项的文本颜色不会自动更改为对比色。DropdownMenuButton中的selectedItemBuilder似乎会在菜单关闭时影响显示,而不是菜单中选定的项目。通过将DropdownMenuItem中的文本颜色与菜单的当前值(例如items: options.map((e) => DropdownMenuItem(value: e.value, child: Text(e.text, style: TextStyle(color: curr_value == e.value ? Colors.black : null)))).toList()(进行比较来更改文本颜色是不够的,因为高亮显示是由于聚焦的项目,而不是因为它是选定的值(当我使用制表符或箭头键更改聚焦的项目时会发生这种情况(。我还试着在DropdownMenuButton源代码中查找线索,但我找不到高亮显示的应用位置。是否有控制高亮显示选项文本颜色的主题参数?

使用布尔变量。将其设置为false,然后在手势检测小部件的帮助下生成onclicked函数

Onclicked(){
var= true,
}

在图标样式内写一个条件:

var?backgroud.Blue:backgroud.white

(附言:我只写了逻辑它的语法不正确(

我终于找到了解决方案!您可以在菜单项小部件中使用Focus.of(context)来检查它们是否集中。这里我有一个例子,其中builder函数被传递给跟踪焦点的包装器Widget。然后,可以在生成器中使用focused来确定要使用哪种文本颜色。

class OptionEntryItemWrapper extends StatefulWidget {
Widget Function(BuildContext, bool) builder;
OptionEntryItemWrapper({required this.builder});
@override
_OptionEntryItemWrapper createState() => _OptionEntryItemWrapper();
}
class _OptionEntryItemWrapper extends State<OptionEntryItemWrapper> {
bool focused = false;
FocusNode? node;
void focus_listener() {
if (mounted && node != null)
setState(() {
focused = node!.hasFocus;
});
;
}
@override
void didChangeDependencies() {
super.didChangeDependencies();
node?.removeListener(focus_listener);
node = Focus.of(context);
node?.addListener(focus_listener);
}
@override
void dispose() {
node?.removeListener(focus_listener);
super.dispose();
}
@override
Widget build(BuildContext context) {
return widget.builder(context, focused);
}
}

DropdownButtonitems:中:

DropdownMenuItem(value: value, child: OptionEntryItemWrapper(builder: builder))

最新更新