Flutter:Fluent UI TextBox无法通过contextMenuBuilder添加自定义菜单
解决Fluent UI TextBox自定义右键菜单无效的问题
问题分析与修复方案
1. 不可变列表导致修改失效
editableTextState.contextMenuButtonItems返回的是不可变列表,直接调用insert方法不会生效,甚至会抛出异常。需要先将其转换为可修改的列表:
// 替换原列表初始化代码 final List<ContextMenuButtonItem> buttons = List.from(editableTextState.contextMenuButtonItems);
2. 验证条件过严(可选调整)
你的_isValid方法仅在选中文本严格等于"finanza"时才添加按钮,测试阶段可以先简化条件,确认菜单功能正常后再细化:
bool _isValid(text) { print(text); return text.isNotEmpty; // 临时改为只要选中文本就显示按钮 }
3. 使用Fluent UI专属工具栏组件
虽然AdaptiveTextSelectionToolbar可以运行,但Fluent UI提供了更贴合风格的FluentTextSelectionToolbar,建议替换:
return FluentTextSelectionToolbar.buttonItems( anchors: editableTextState.contextMenuAnchors, buttonItems: buttons, );
修复后的完整代码示例
TextBox( controller: controllerBody, placeholder: 'Insert ', contextMenuBuilder: (BuildContext context, EditableTextState editableTextState) { // 转为可修改列表 final List<ContextMenuButtonItem> buttons = List.from(editableTextState.contextMenuButtonItems); final TextEditingValue value = controllerBody.value; String text = value.selection.textInside(value.text); if (_isValid(text)) { print(text); buttons.insert( 0, ContextMenuButtonItem( label: 'Send email', onPressed: () { ContextMenuController.removeAny(); print('ollo'); }, ), ); } // 使用Fluent专属工具栏 return FluentTextSelectionToolbar.buttonItems( anchors: editableTextState.contextMenuAnchors, buttonItems: buttons, ); }, ), bool _isValid(text) { print(text); return text.isNotEmpty; // 临时简化验证条件 }
额外排查点
- 确认
controllerBody已正确初始化(final TextEditingController controllerBody = TextEditingController();) - 测试时必须选中文本,未选中时
value.selection.textInside(value.text)会返回空字符串,无法触发按钮添加逻辑 - 检查控制台是否有异常输出,若存在不可变列表修改的报错,说明列表转换步骤是必须的
内容的提问来源于stack exchange,提问作者Fabio Fagiani
相关产品推荐
相关产品推荐

