Текстовое поле Flutter на firetv / firestick поверх текстового поля

При вызове текстового поля на флаттере в fireOS на устройствах fire tv, например, для выполнения поиска виртуальная клавиатура fireOS появляется поверх текстового поля и не работает, как на других устройствах Android, где клавиатура находится внизу, а текстовое поле видно.

Например, в устаревших версиях Android я могу использовать виджет edittext, и та же самая клавиатура появляется сверху, но все, что я набираю с контроллером, обновляется на самой виртуальной клавиатуре, потому что клавиатура имеет собственное текстовое поле или edittext. Итак, моя проблема в том, как я могу обновить текст редактирования на виртуальной клавиатуре firetv с помощью флаттера.

введите описание изображения здесь


person Adrian M Cavazos    schedule 10.04.2020    source источник


Ответы (1)


Хорошо, поэтому я нигде не нашел ответа, поэтому мне пришлось проделать кое-какие хакерские штуки, вот как я заставил его работать, так как флаттер - это не годится.

Обзор решения:

1.- Итак, сначала проверьте, работаете ли вы на Android, вы можете сделать это с помощью if (Platform.isAndroid) на флаттере.

2.- Если вы действительно работаете на Android, вы можете открыть канал платформы для собственного Android, чтобы проверить фактического производителя (я опубликую, как кодировать ниже).

3.- Проверьте производителя или имя устройства на наличие «Amazon» или «Kindle» или чего-то еще, if (string.contains («»)) поможет.

4.- Откройте снова канал платформы для Native Android и откройте диалоговое окно с предупреждением с помощью Edittext, запишите полученную строку и верните ее в режим flutter.

Вот так я заставил клавиатуру firetv работать в условиях флаттера.

    if (Platform.isAndroid){

      checkOs().then((String osName){
        print("Device running on: $osName");
        if(osName.contains("Amazon") || osName.contains("AFTN")){
          fireTvKeyboardInput().then((String result){
            buscarTitulo(result);
          });
        }else{
          _showDialog(); // Keyboard for NON FIREOS devices on Android.
        }
      });

    }else{
      //IF Device is not Android Eg. IOS
      _showDialog();
    }

Теперь есть две функции, которые я использовал "checkOs" и "fireTvKeyboardInput", вот код:

Future<String> checkOs() async {
  String myResult = "";
  try {
    myResult = await platform.invokeMethod("checkOS", <String, dynamic>{
      'param1': "hello",
    });
  }catch (e){
    print ("exception: $e");
  }
  return myResult;
}

Future<String> fireTvKeyboardInput() async {
  String myResult = "";
  try {
    myResult = await platform.invokeMethod("fireKeyBoard", <String, dynamic>{
      'param1': "hello",
    });
  }catch (e){
    print ("exception: $e");
  }
  return myResult;
}

На Native Android есть код:

                    if(call.method == "checkOS"){
                    val operatingSystem = android.os.Build.MANUFACTURER + "- " + android.os.Build.MODEL
                    result.success(operatingSystem)
                }

                if(call.method == "fireKeyBoard"){

                        val alert = AlertDialog.Builder(this)
                        alert.setMessage("Search")
                        // Set an EditText view to get user input
                        val input = EditText(this)
                        input.hint = "Enter Text"
                        input.inputType = InputType.TYPE_CLASS_TEXT
                        alert.setView(input)
                        input.setOnKeyListener { view, keyCode, keyEvent ->
                            if (keyCode == 66) {
                                val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
                                imm.hideSoftInputFromWindow(input.windowToken, 0)
                            }
                            false
                        }
                        alert.setPositiveButton("Ok") { dialog, whichButton ->
                            result.success(input.text.toString());
                        }
                        alert.setNegativeButton("Cancel") { dialog, whichButton ->
                            // Canceled.
                        }
                        alert.show()

                }
person Adrian M Cavazos    schedule 01.05.2020