为 TextEditingController.buildTextSpan 添加了 BuildContext 参数
概述
#一个 BuildContext
参数已添加到 TextEditingController.buildTextSpan
中。
扩展或实现 TextEditingController
并重写 buildTextSpan
的类需要将 BuildContext
参数添加到签名中,以使其成为有效的重写。
TextEditingController.buildTextSpan
的调用者需要向该调用传递一个 BuildContext
。
背景
#TextEditingController.buildTextSpan
由 EditableText
在其控制器上调用,以创建它所渲染的 TextSpan
(文本片段)。buildTextSpan
可以在扩展 TextEditingController
的自定义类中被重写。这使得扩展 TextEditingController
的类通过重写 buildTextSpan
来改变文本部分样式,例如,用于富文本编辑。
buildTextSpan
所需的任何状态(除了 TextStyle
和 withComposing
参数之外)都需要被传递到扩展 TextEditingController
的类中。
变更说明
#随着 BuildContext
的可用,用户可以在 buildTextSpan
内部访问 InheritedWidgets
,以获取设置文本样式所需的状态,或以其他方式操作所创建的 TextSpan
。
考虑以下示例:我们有一个 HighlightTextEditingController
,它希望通过将其颜色设置为 Theme.accentColor
来高亮文本。
在此更改之前,控制器实现如下所示
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
。
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
#将 required BuildContext context
参数添加到 buildTextSpan
重写的签名中。
迁移前的代码
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})').
迁移后的代码
class MyTextEditingController {
@override
TextSpan buildTextSpan({required BuildContext context, TextStyle? style, required bool withComposing}) {
/* ... */
}
}
调用 TextEditingController.buildTextSpan
#向该调用传递一个类型为 BuildContext
的命名参数 'context'。
迁移前的代码
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.
迁移后的代码
BuildContext context = /* ... */;
TextEditingController controller = /* ... */;
TextSpan span = controller.buildTextSpan(context: context, withComposing: false);
时间线
#发布版本:1.26.0
稳定版本:2.0.0
参考资料
#API 文档
相关问题
相关 PR