概述

#

已向 TextEditingController.buildTextSpan 添加了 BuildContext 引數。

擴充套件或實現 TextEditingController 並覆蓋 buildTextSpan 的類需要將 BuildContext 引數新增到簽名中,使其成為一個有效的覆蓋。

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

背景

#

TextEditingController.buildTextSpanEditableText 在其控制器上呼叫,以建立它渲染的 TextSpanbuildTextSpan 可以在擴充套件 TextEditingController 的自定義類中被覆蓋。這允許擴充套件 TextEditingController 的類覆蓋 buildTextSpan 以更改文字部分的樣式,例如,用於富文字編輯。

buildTextSpan 所需的任何狀態(除了 TextStylewithComposing 引數)都需要傳遞給擴充套件 TextEditingController 的類。

變更說明

#

透過可用的 BuildContext,使用者可以在 buildTextSpan 中訪問 InheritedWidgets,以檢索樣式文字所需的 state,或以其他方式操作建立的 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

#

buildTextSpan 覆蓋的簽名中新增一個 required BuildContext context 引數。

遷移前的程式碼

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