interceptorInput static method

dynamic interceptorInput()

Implementation

static interceptorInput() {
  if (isInterceptor) return;
  isInterceptor = true;
  ServicesBinding.instance!.defaultBinaryMessenger
      .setMockMessageHandler("flutter/textinput", (ByteData? data) async {
    var methodCall = _codec.decodeMethodCall(data);
    switch (methodCall.method) {
      case 'TextInput.show':
        if (_currentKeyboard != null) {
          if (clearTask != null) {
            clearTask!.cancel();
            clearTask = null;
          }
          openKeyboard();
          return _codec.encodeSuccessEnvelope(null);
        } else {
          return await _sendPlatformMessage("flutter/textinput", data);
        }
        break;
      case 'TextInput.hide':
        if (_currentKeyboard != null) {
          if (clearTask == null) {
            clearTask = new Timer(Duration(milliseconds: 16),
                    () => hideKeyboard(animation: true));
          }
          return _codec.encodeSuccessEnvelope(null);
        } else {
          return await _sendPlatformMessage("flutter/textinput", data);
        }
        break;
      case 'TextInput.setEditingState':
        var editingState = TextEditingValue.fromJSON(methodCall.arguments);
        if (editingState != null && _keyboardController != null) {
          _keyboardController!.value = editingState;
          return _codec.encodeSuccessEnvelope(null);
        }
        break;
      case 'TextInput.clearClient':
        if (clearTask == null) {
          clearTask = new Timer(Duration(milliseconds: 16),
                  () => hideKeyboard(animation: true));
        }
        clearKeyboard();
        break;
      case 'TextInput.setClient':
        var setInputType = methodCall.arguments[1]['inputType'];
        InputClient? client;
        _keyboards.forEach((inputType, keyboardConfig) {
          if (inputType.name == setInputType['name']) {
            client = InputClient.fromJSON(methodCall.arguments);

            _keyboardParam =
                (client!.configuration!.inputType as CKTextInputType).params;

            clearKeyboard();
            _currentKeyboard = keyboardConfig;
            _keyboardController = KeyboardController(client: client)
              ..addListener(() {
                var callbackMethodCall = MethodCall(
                    "TextInputClient.updateEditingState", [
                  _keyboardController!.client!.connectionId,
                  _keyboardController!.value.toJSON()
                ]);
                ServicesBinding.instance!.defaultBinaryMessenger
                    .handlePlatformMessage(
                    "flutter/textinput",
                    _codec.encodeMethodCall(callbackMethodCall),
                        (data) {});
              });
            if (_pageKey != null) {
              _pageKey!.currentState?.update();
            }
          }
        });

        if (client != null) {
          await _sendPlatformMessage("flutter/textinput",
              _codec.encodeMethodCall(MethodCall('TextInput.hide')));
          return _codec.encodeSuccessEnvelope(null);
        } else {
          if (clearTask == null) {
            hideKeyboard(animation: false);
          }
          clearKeyboard();
        }
        break;
    }
    ByteData response = await _sendPlatformMessage("flutter/textinput", data);
    return response;
  });
}