跳至主要内容

向 TextEditingController.buildTextSpan 添加 BuildContext 参数

摘要

#

TextEditingController.buildTextSpan 添加了一个 BuildContext 参数。

扩展或实现 TextEditingController 并覆盖 buildTextSpan 的类需要在签名中添加 BuildContext 参数,以使其成为有效的覆盖。

TextEditingController.buildTextSpan 的调用者需要向调用传递 BuildContext

上下文

#

TextEditingController.buildTextSpanEditableText 在其控制器上调用,以创建其渲染的 TextSpan。在扩展 TextEditingController 的自定义类中可以覆盖 buildTextSpan。这允许扩展 TextEditingController 的类覆盖 buildTextSpan 来更改文本部分的样式,例如,用于富文本编辑。

buildTextSpan 所需的任何状态(除了 TextStylewithComposing 参数之外)都需要传递到扩展 TextEditingController 的类中。

变更说明

#

有了可用的 BuildContext,用户可以在 buildTextSpan 内部访问 InheritedWidgets 以检索设置文本样式所需的状态,或以其他方式操作创建的 TextSpan

考虑一个示例,其中我们有一个 HighlightTextEditingController,它希望通过将其颜色设置为 Theme.accentColor 来突出显示文本。

在此更改之前,控制器的实现如下所示

dart
class HighlightTextEditingController extends TextEditingController {
  HighlightTextEditingController(this.highlightColor);

  final Color highlightColor;

  @override
  TextSpan buildTextSpan({TextStyle? style, required bool withComposing}) {
    return super.buildTextSpan(style: TextStyle(color: highlightColor), withComposing: withComposing);
  }

并且控制器的用户需要在创建控制器时传递颜色。

有了可用的 BuildContext 参数,HighlightTextEditingController 可以使用 Theme.of(BuildContext) 直接访问 Theme.accentColor

dart
class HighlightTextEditingController extends TextEditingController {
  @override
  TextSpan buildTextSpan({required BuildContext context, TextStyle? style, required bool withComposing}) {
    final Color color = Theme.of(context).accentColor;
    return super.buildTextSpan(context: context, style: TextStyle(color: color), withComposing: withComposing);
  }
}

迁移指南

#

覆盖 TextEditingController.buildTextSpan

#

buildTextSpan 覆盖的签名中添加一个 required BuildContext context 参数。

迁移前代码

dart
class MyTextEditingController {
  @override
  TextSpan buildTextSpan({TextStyle? style, required bool withComposing}) {
    /* ... */
  }
}

迁移前示例错误消息

'MyTextEditingController.buildTextSpan' ('TextSpan Function({TextStyle? style, required bool withComposing})') isn't a valid override of 'TextEditingController.buildTextSpan' ('TextSpan Function({required BuildContext context, TextStyle? style, required bool withComposing})').

迁移后代码

dart
class MyTextEditingController {
  @override
  TextSpan buildTextSpan({required BuildContext context, TextStyle? style, required bool withComposing}) {
    /* ... */
  }
}

调用 TextEditingController.buildTextSpan

#

向调用传递一个名为“context”、类型为 BuildContext 的参数。

迁移前代码

dart
TextEditingController controller = /* ... */;
TextSpan span = controller.buildTextSpan(withComposing: false);

迁移前错误消息

The named parameter 'context' is required, but there's no corresponding argument.
Try adding the required argument.

迁移后代码

dart
BuildContext context = /* ... */;
TextEditingController controller = /* ... */;
TextSpan span = controller.buildTextSpan(context: context, withComposing: false);

时间线

#

包含于版本:1.26.0
稳定版发布:2.0.0

参考

#

API 文档

相关问题

相关 PR