概述

#

TextInputClient 接口添加一个 currentTextEditingValue 字段,以从平台客户端获取可编辑文本字段的当前值。

背景

#

TextInputClient 类由 Flutter 框架用来与平台代码就 EditableText 等文本输入小部件的当前状态进行通信。

当 Android 应用进入后台时,平台端可能会丢失其状态。在此更改后,应用可以向框架请求最后已知状态。为了获取此信息,TextEditingValue 已被暴露给 TextInputClient

变更说明

#

在某些支持的平台上,应用程序可以进入后台,预期会消耗更少的资源。例如,后台运行的 Android 应用程序应避免消耗不必要的内存,并且不需要保留对视图的引用。在此更改之前,当应用重新回到前台时,特定于 Android 的平台代码可能会丢失可编辑文本字段的状态信息。例如,这会发生在 TextField 小部件中输入的文本丢失于 Java 代码,但仍被 Dart 代码记住的情况。

在此更改后,平台端现在会发送一个名为 TextInput.requestExistingStatetextInput 通道消息。这会通知 Dart 代码,当应用唤醒时,它应该重新建立任何文本输入连接,并将其最近已知编辑状态通知平台。

TextInput 类使用 TextInputClient 接口与客户端小部件进行交互。该接口以前没有提供对客户端当前值的任何洞察。为了允许 TextInput 类适当地响应 TextInput.requestExistingState,在 TextInputClient 中添加了一个名为 currentTextEditingValue 的新 getter。您不能安全地使用传递给 TextInputConnection.setEditingState 的最后一个值,因为客户端仅在特定情况下调用该方法,例如当 Dart 代码直接修改 TextEditingController 的值,并且该修改不直接反映平台对按键输入事件的响应的原生处理方式。例如,TextInputFormatter 通常就是这样工作的,或者当 Dart 代码直接设置 TextEditingController.value 时也会发生这种情况。

迁移指南

#

如果您之前实现了 TextEditingClient 或扩展了它,您现在必须添加对 currentTextEditingValue 的相应覆盖。

此值可能为 null。

如果您想在更改合并到代码库之前进行迁移,可以在您的类中添加一个类似以下的类:

dart
abstract class _TemporaryTextEditingClient {
  TextEditingValue get currentTextEditingValue;
}

这允许您在更改合并到框架之前,使用 @override 注释添加新成员。之后,您可以删除临时接口定义。

迁移前的代码

dart
class _MyCustomTextWidgetState extends State<MyCustomWidget> implements TextEditingClient {
  ...

  @override
  void updateEditingValue(TextEditingValue value) {
    ...
  }

  @override
  void performAction(TextInputAction action) {
    ...
  }

  @override
  void updateFloatingCursor(RawFloatingCursorPoint point) {
    ...
  }
}

迁移后的代码

dart
class _MyCustomTextWidgetState extends State<MyCustomWidget> implements TextEditingClient {
  ...

  @override
  TextEditingValue get currentTextEditingValue => widget.textEditingController.value;

  @override
  void updateEditingValue(TextEditingValue value) {
    ...
  }

  @override
  void performAction(TextInputAction action) {
    ...
  }

  @override
  void updateFloatingCursor(RawFloatingCursorPoint point) {
    ...
  }
}

时间线

#

发布版本: 1.16.3
稳定版本: 1.17

参考资料

#

API 文档

相关议题

相关 PR