receiveAction method

Future<void> receiveAction (TextInputAction action)

Simulates the user pressing one of the TextInputAction buttons. Does not check that the TextInputAction performed is an acceptable one based on the inputAction setClientArgs.

Implementation

Future<void> receiveAction(TextInputAction action) async {
  return TestAsyncUtils.guard(() {
    // Not using the `expect` function because in the case of a FlutterDriver
    // test this code does not run in a package:test test zone.
    if (_client == 0) {
      throw TestFailure('Tried to use TestTextInput with no keyboard attached. You must use WidgetTester.showKeyboard() first.');
    }

    final Completer<void> completer = Completer<void>();

    BinaryMessages.handlePlatformMessage(
      SystemChannels.textInput.name,
      SystemChannels.textInput.codec.encodeMethodCall(
        MethodCall(
          'TextInputClient.performAction',
          <dynamic>[_client, action.toString()],
        ),
      ),
      (ByteData data) {
        try {
          // Decoding throws a PlatformException if the data represents an
          // error, and that's all we care about here.
          SystemChannels.textInput.codec.decodeEnvelope(data);

          // No error was found. Complete without issue.
          completer.complete();
        } catch (error) {
          // An exception occurred as a result of receiveAction()'ing. Report
          // that error.
          completer.completeError(error);
        }
      },
    );

    return completer.future;
  });
}