跳至主要內容

為 TextEditingController.buildTextSpan 新增 BuildContext 參數

摘要

#

已為 TextEditingController.buildTextSpan 新增 BuildContext 參數。

擴充或實作 TextEditingController 並覆寫 buildTextSpan 的類別,需要在簽名中新增 BuildContext 參數,使其成為有效的覆寫。

TextEditingController.buildTextSpan 的呼叫者需要將 BuildContext 傳遞給呼叫。

背景

#

TextEditingController.buildTextSpanEditableText 在其控制器上呼叫,以建立它所渲染的 TextSpanbuildTextSpan 可以在擴展 TextEditingController 的自訂類別中覆寫。這允許擴展 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

#

required BuildContext context 參數新增至 buildTextSpan 覆寫的簽名。

遷移前的程式碼

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

#

將型別為 BuildContext 的具名參數 'context' 傳遞給呼叫。

遷移前的程式碼

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