mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00
This commit is contained in:
parent
d2bc74aa6d
commit
324fe201b0
@ -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) {}
|
||||
}
|
Loading…
Reference in New Issue
Block a user