為 TextEditingController.buildTextSpan 新增 BuildContext 引數
概述
#已向 TextEditingController.buildTextSpan 添加了 BuildContext 引數。
擴充套件或實現 TextEditingController 並覆蓋 buildTextSpan 的類需要將 BuildContext 引數新增到簽名中,使其成為一個有效的覆蓋。
呼叫 TextEditingController.buildTextSpan 的呼叫者需要將 BuildContext 傳遞給該呼叫。
背景
#TextEditingController.buildTextSpan 由 EditableText 在其控制器上呼叫,以建立它渲染的 TextSpan。buildTextSpan 可以在擴充套件 TextEditingController 的自定義類中被覆蓋。這允許擴充套件 TextEditingController 的類覆蓋 buildTextSpan 以更改文字部分的樣式,例如,用於富文字編輯。
buildTextSpan 所需的任何狀態(除了 TextStyle 和 withComposing 引數)都需要傳遞給擴充套件 TextEditingController 的類。
變更說明
#透過可用的 BuildContext,使用者可以在 buildTextSpan 中訪問 InheritedWidgets,以檢索樣式文字所需的 state,或以其他方式操作建立的 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