Unverified Commit 324fe201 authored by Matt Carroll's avatar Matt Carroll Committed by GitHub

Add handling of 'TextInput.clearClient' message from platform to framework (#35054). (#35100)

parent d2bc74aa
......@@ -632,7 +632,7 @@ abstract class TextInputClient {
/// See also:
///
/// * [TextInput.attach]
class TextInputConnection {
class TextInputConnection with ChangeNotifier {
TextInputConnection._(this._client)
: assert(_client != null),
_id = _nextId++;
......@@ -667,12 +667,19 @@ class TextInputConnection {
void close() {
if (attached) {
SystemChannels.textInput.invokeMethod<void>('TextInput.clearClient');
_clientHandler
.._currentConnection = null
.._scheduleHide();
_onConnectionClosed();
_clientHandler._scheduleHide();
}
assert(!attached);
}
/// Clear out the current text input connection.
///
/// Call this method when the current text input connection has cleared.
void _onConnectionClosed() {
_clientHandler._currentConnection = null;
notifyListeners();
}
}
TextInputAction _toTextInputAction(String action) {
......@@ -753,6 +760,9 @@ class _TextInputClientHandler {
case 'TextInputClient.updateFloatingCursor':
_currentConnection._client.updateFloatingCursor(_toTextPoint(_toTextCursorAction(args[1]), args[2]));
break;
case 'TextInputClient.onConnectionClosed':
_currentConnection._onConnectionClosed();
break;
default:
throw MissingPluginException();
}
......
......@@ -85,5 +85,44 @@ void main() {
expect(signed.hashCode == signedDecimal.hashCode, false);
expect(decimal.hashCode == signedDecimal.hashCode, false);
});
test('The framework TextInputConnection closes when the platform loses its input connection', () async {
// Assemble a TextInputConnection so we can verify its change in state.
final TextInputClient client = NoOpTextInputClient();
const TextInputConfiguration configuration = TextInputConfiguration();
final TextInputConnection textInputConnection = TextInput.attach(client, configuration);
// Verify that TextInputConnection think its attached to a client. This is
// an intermediate verification of expected state.
expect(textInputConnection.attached, true);
// Pretend that the platform has lost its input connection.
final ByteData messageBytes = const JSONMessageCodec().encodeMessage(
<String, dynamic>{
'args': <dynamic>[1],
'method': 'TextInputClient.onConnectionClosed',
}
);
defaultBinaryMessenger.handlePlatformMessage(
'flutter/textinput',
messageBytes,
(ByteData _) {},
);
// Verify that textInputConnection no longer think its attached to an input
// connection. This is the critical verification of this test.
expect(textInputConnection.attached, false);
});
});
}
class NoOpTextInputClient extends TextInputClient {
@override
void performAction(TextInputAction action) {}
@override
void updateEditingValue(TextEditingValue value) {}
@override
void updateFloatingCursor(RawFloatingCursorPoint point) {}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment