概述

#

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

背景

#

Flutter 框架使用 TextInputClient 类与平台代码通信,以了解 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