You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 23:56:18