为 TextEditingController.buildTextSpan 添加 BuildContext 参数
摘要
#TextEditingController.buildTextSpan
方法添加了一个 BuildContext
参数。
扩展或实现 TextEditingController
并重写 buildTextSpan
的类需要向签名中添加 BuildContext
参数以使其成为有效的重写。
TextEditingController.buildTextSpan
的调用者需要向调用中传递一个 BuildContext
。
背景
#EditableText
调用 TextEditingController.buildTextSpan
来创建其渲染的 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
#向 buildTextSpan
重写的签名中添加一个 required BuildContext context
参数。
迁移前的代码:
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:
- 重新提交“向 TextEditingController.buildTextSpan 添加 BuildContext 参数” #73510
- 撤销“向 TextEditingController.buildTextSpan 添加 BuildContext 参数” #73503
- 向 TextEditingController.buildTextSpan 添加 BuildContext 参数 #72344
除非另有说明,否则本网站上的文档反映的是 Flutter 的最新稳定版本。页面最后更新于 2025-01-30。 查看源代码 或 报告问题。