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:
|
/// See also:
|
||||||
///
|
///
|
||||||
/// * [TextInput.attach]
|
/// * [TextInput.attach]
|
||||||
class TextInputConnection {
|
class TextInputConnection with ChangeNotifier {
|
||||||
TextInputConnection._(this._client)
|
TextInputConnection._(this._client)
|
||||||
: assert(_client != null),
|
: assert(_client != null),
|
||||||
_id = _nextId++;
|
_id = _nextId++;
|
||||||
@ -667,12 +667,19 @@ class TextInputConnection {
|
|||||||
void close() {
|
void close() {
|
||||||
if (attached) {
|
if (attached) {
|
||||||
SystemChannels.textInput.invokeMethod<void>('TextInput.clearClient');
|
SystemChannels.textInput.invokeMethod<void>('TextInput.clearClient');
|
||||||
_clientHandler
|
_onConnectionClosed();
|
||||||
.._currentConnection = null
|
_clientHandler._scheduleHide();
|
||||||
.._scheduleHide();
|
|
||||||
}
|
}
|
||||||
assert(!attached);
|
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) {
|
TextInputAction _toTextInputAction(String action) {
|
||||||
@ -753,6 +760,9 @@ class _TextInputClientHandler {
|
|||||||
case 'TextInputClient.updateFloatingCursor':
|
case 'TextInputClient.updateFloatingCursor':
|
||||||
_currentConnection._client.updateFloatingCursor(_toTextPoint(_toTextCursorAction(args[1]), args[2]));
|
_currentConnection._client.updateFloatingCursor(_toTextPoint(_toTextCursorAction(args[1]), args[2]));
|
||||||
break;
|
break;
|
||||||
|
case 'TextInputClient.onConnectionClosed':
|
||||||
|
_currentConnection._onConnectionClosed();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
throw MissingPluginException();
|
throw MissingPluginException();
|
||||||
}
|
}
|
||||||
|
@ -85,5 +85,44 @@ void main() {
|
|||||||
expect(signed.hashCode == signedDecimal.hashCode, false);
|
expect(signed.hashCode == signedDecimal.hashCode, false);
|
||||||
expect(decimal.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