為 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
,以檢索樣式化文字所需的狀態,或以其他方式操作建立的 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
- Reland "將 BuildContext 參數新增至 TextEditingController.buildTextSpan" #73510
- 還原 "將 BuildContext 參數新增至 TextEditingController.buildTextSpan" #73503
- 將 BuildContext 參數新增至 TextEditingController.buildTextSpan #72344
除非另有說明,否則本網站上的文件反映了 Flutter 的最新穩定版本。頁面上次更新時間為 2024-04-04。 檢視原始碼 或 回報問題。