Flutter: Клавиатура Samsung дублирует текст при восстановлении составляющих областей (перезапуск ввода текста, пунктуации)

Созданный на 23 апр. 2019  ·  139Комментарии  ·  Источник: flutter/flutter

Привет!

В приложении Flutter с TextField или TextFormField текст может дублироваться при первом вводе данных.

При первом вводе нажатия клавиши в поле, которое уже имеет предварительно заполненный текст, текст дублируется, затем ваше нажатие клавиши прикрепляется.

Я испытываю то, что демонстрирует такое поведение на моих Samsung Galaxy S7, S8 и S9 (только на устройствах, с которыми мне нужно тестировать). Этого не происходит в эмуляторе (Galaxy Nexus9 и Pixel 2).

Если я поставлю пробел в конце поля, этой проблемы не произойдет, однако, если я коснусь середины предварительно заполненного поля (с помощью контроллера или initialValue) и нажму клавишу, это произойдет.

class SampleTextFormPage extends StatefulWidget {
    <strong i="10">@override</strong>
    State<StatefulWidget> createState() => new _SampleTextFormPage();
}

class _SampleTextFormPage extends State<SampleTextFormPage> {
    final _scaffoldKey = new GlobalKey<ScaffoldState>();

    TextEditingController _txtController;

    <strong i="11">@override</strong>
    void initState() {
        super.initState();

        _txtController = TextEditingController(text:'Using Controller');
    }

    <strong i="12">@override</strong>
    Widget build(BuildContext context) { Scaffold scaffold = new Scaffold(
        key: _scaffoldKey,
        appBar: new AppBar(
            title: new Text('Text Entry',
                style: const TextStyle(
                    color: Colors.white)
            ),
            backgroundColor: Colors.indigo
        ),
        body:  Column(children: [
            //field 1
            TextField(
                 autocorrect: false,
                 autofocus: true,
                 controller: _txtController,
            ),

           //field 2
           TextFormField(
               autocorrect: false,
               autofocus: true,
               initialValue: 'Using initialValue',
           )
        ])
    );

    return scaffold;
    }
}

https://stackoverflow.com/questions/52894507/flutter-texfield-and-textformfield-duplicates-text-when-using-initial-value-or-c

text input crowd device-specific engine material design platform-android

Самый полезный комментарий

Подтвержденный текст больше не повторяется в пунктуации. Изменение внесено в основной канал через https://github.com/flutter/flutter/commit/fbb2f07497868a2b63c23abaa31aed02fc13d057.

Есть еще вторая половина ошибки, когда текст дублируется, когда клавиатура скрыта + не скрыта + тип. Это не проходит через кодовый путь finishComposingText и требует другого обходного пути.

Все 139 Комментарий

Ошибка в любом приложении написано флаттером. Даже на базе с одним полем ввода.
Ошибка воспроизведения при вводе русских слов / букв

Спасибо за отправку. Я не могу сейчас воспроизвести это на физическом Pixel 2. Думаю, у меня есть S7, на котором я могу примерить завтра. Я отправлю ответ о том, что происходит.

Спасибо за отправку. Я не могу сейчас воспроизвести это на физическом Pixel 2. Думаю, у меня есть S7, на котором я могу примерить завтра. Я отправлю ответ о том, что происходит.

Тестирую на galaxy s8 и s9
Воспроизводится только русскими буквами.
Сценарий

  • Введите слово
  • Пробел
  • Удалить дважды (будет удален один пробел и одна буква)
  • Введите любую букву на русском языке

Итого: дублирует все слово + букву

Ошибка воспроизводится в Google Ad. Установлен с плей маркета

Хорошо, у меня есть S6, и я только что установил русскую клавиатуру, но я не вижу ошибки с использованием кода, который вы предоставили выше.

Запустите приложение и удалите существующий текст:

Введите слово на русском языке с одним пробелом:

Дважды нажмите клавишу возврата:

Введите букву, но дублирования не вижу:

Возьмите любой телефон семейства galaxy s8 или s9.
Установите пустое приложение с одним входом и попробуйте стандартную клавиатуру с русскими буквами.

Тестировал на двух топовых Samsung s8 / s9.

https://www.youtube.com/watch?v=MVR8lW_tYww

Можете ли вы попробовать это в собственном приложении и убедиться, что вы не видите такого поведения?

Использую стандартные прошивки Samsung Galaxy S8 и Galaxy S9.
Все приложения, которые установлены на телефоне, работают нормально. Родное приложение, реагировать на родной, телеграмму, скайп, гугл и так далее.

Мы столкнулись с этой проблемой на этапе выпуска нашего приложения flutter.

Хорошо, понятно, спасибо за пояснение. Я попробовал еще раз с S6, но с клавиатурой по умолчанию на русском языке и все еще не смог воспроизвести его. Попробую разыскать S8 или S9.

Русская клавиатура не требуется.
Проверено на Samsung T580.

Создайте приложение с TextField:

  • Введите несколько букв.
  • Нажмите кнопку «Готово» на клавиатуре, чтобы закрыть ее.
  • Щелкните поле еще раз и щелкните букву.

Итак, если вы введете «Ла», закройте, откройте и нажмите «!». Текстовое поле будет читать «ЛаЛа!».

_Это было протестировано в ветке dev (1.5.8) и стабильной (1.2.1). _

Примечание: он не воспроизводится на Samsung S8.
Связанная SO: https://stackoverflow.com/questions/52894507/flutter-texfield-and-textformfield-duplicates-text-when-using-initial-value-or-c

Я нашел Samsung T110 и не смог его воспроизвести. Надеюсь попробовать это на S9 или T580, когда смогу.

Вышеупомянутая проблема также сообщала об этой проблеме на: Samsung Galaxy Tablet 8 A (Android 8.1). Там тоже куча хороших инструкций по воспроизведению. Похоже, это определенно связано с предиктивным текстом Samsung.

Вышеупомянутая проблема также сообщала об этой проблеме на: Samsung Galaxy Tablet 8 A (Android 8.1). Там тоже куча хороших инструкций по воспроизведению. Похоже, это определенно связано с предиктивным текстом Samsung.

когда ждать решения проблемы?

Это в моем списке вещей, которые я хотел бы исправить, хотя я до сих пор не встречал устройства, которое могло бы это воспроизвести ...

Если у вас или у кого-то еще есть время поработать над PR, чтобы исправить это, пожалуйста, сделайте это!

Дополнительное тестирование для # 33255 показало еще одно интересное поведение @justinmc
Сначала я набрал «abc def». С пространством посередине.
Хит готово.
Снова коснулся ввода, набрал 'g'
Виджет редактирования теперь показывает abc defdefg

Интересно, смотрел ли это на последнее слово, я попробовал другой тестовый пример.

Исходный текст

abc def ghi

Нажмите "Готово", коснитесь виджета, чтобы отредактировать его.
Вход

j

Виджет редактирования теперь показывает: 'abc def ghighij'

Flutter v1.5.4-hotfix.2,

Стандартная клавиатура
По согласованию с @charlesokt. Я тестировал это на Galaxy S9 и S9 Note. Отключение интеллектуального ввода текста на клавиатуре Samsung предотвращает дублирование.

Начальное значение текста / удаление всего текста до меньшего размера каретки
Если вы создаете новое текстовое поле / textFormField без исходного текстового значения, проблема, похоже, не проявляется. Однако при установке начальных значений это произойдет. Если у вас есть начальное значение и вы нажмете клавишу удаления, чтобы «полностью» удалить весь текст, вы заметите, что размер каретки изменится с большего размера на меньший. Когда он достигнет меньшего размера, проблема дублирования не возникнет, даже если вы установили исходное текстовое значение.

Возможная проблема, связанная с этим
Я наткнулся на обсуждение, которое кажется относящимся к этой ошибке. Обратите внимание на обсуждение дублированного текста, предиктивного текста и т. Д.

https://github.com/flutter/flutter/issues/22828

Помогите решить проблему! Наш релиз задерживается из-за этого.

Вот похожая проблема # 19743
Прошел год ..

Чтобы добавить еще одно уязвимое устройство в список, эта проблема была замечена в https://github.com/flutter/flutter/issues/19743 на Galaxy Grand Prime с Android 5.1.1.

Я не могу ничего обещать, но я скомпилировал движок флаттера и попытаюсь диагностировать и / или исправить это.

Ниже приведены более полные журналы того, что я вижу при отладочной сборке движка, на котором выполняется мой тестовый сценарий, как подробно описано в # 33255. Я сделал оператор печати, когда контроллер редактирования текста получает сообщение об изменении текста, поэтому вы увидите запись журнала «новый текст ->», когда контроллер вызывается из моего TextEdit. Для этого теста я сделал следующее:

  1. коснулся TextEdit
  2. нажмите "а", готово
  3. снова коснулся TextEdit
  4. нажмите "d".
  5. Виджет TextEdit теперь показывает "aad".

Для полноты, эта проблема, похоже, затрагивает только устройства Samsung, и отключение интеллектуального ввода текста на устройстве, похоже, позволяет избежать проблемы.

Тест проводился на SM-T380, Samsung Galaxy Note 8A, Android 8.1.1 с использованием текущей бета-версии 1.6.3.
Каркас: bc7bc94083
Двигатель: 8dc3a4cde2

Журналы отладки для всех желающих и заинтересованных:

06-10 19: 02: 23.050 5555 5584 Я трепещу: новый текст -> a
06-10 19: 02: 23.051 1566 1566 V Поверхность: sf_framedrop отладка: 0x4f4c, игра: false, ведение журнала: 0
06-10 19: 02: 23.051 1566 1566 D ViewRootImpl @ 6844e5e [InputMethod]: Relayout возвращено: old = [0,542] [800,1280] new = [0,542] [800,1280] result = 0x7 surface = {valid = true 2333847552} изменено = истина
06-10 19: 02: 23.053 1566 4806 Вт Adreno-EGL: <612 i = "22">: EGL_BAD_ATTRIBUTE
06-10 19: 02: 23.058 1566 4806 D vndksupport: Загрузка /vendor/lib/hw/gralloc.msm8937.so из текущего пространства имен вместо пространства имен sphal.
06-10 19: 02: 23.059 1566 4806 D OpenGLRenderer: eglCreateWindowSurface = 0xac813f48, 0x8b1bb008
06-10 19: 02: 23.062 1566 1566 I SKBD: azs getNavigationBarHeight () первое использование заняло: 1
06-10 19: 02: 23.071 1566 1566 V InputMethodManager: целевое окно не IME, игнорирование
06-10 19: 02: 23.072 1566 1566 Я болтаю: uid = 10126 (com.sec.android.inputmethod) идентичные 3 строки
06-10 19: 02: 23.072 1566 1566 V InputMethodManager: целевое окно не IME, игнорирование
06-10 19:02: 23.073 1566 1566 I SKBD: ToolBarContainer [PF_OP] [updateToolBarPage] 5126562
06-10 19:02: 23.141 1566 1566 I SKBD: AbstractKeyboardView drawAllKey nanoTime = 55282031, isOrientationLandscape () = false
06-10 19:02: 23,141 1566 1566 I SKBD_Performance: AbstractKeyboardView [PF_OP] onDraw 57409948
06-10 19:02: 23.142 1566 1566 I SKBD_Performance: AbstractKeyboardView [PF_OP] onDraw 44687
06-10 19: 02: 23.150 1094 1121 D WindowManager: finishDrawingWindow: Window {d04c601 u0 InputMethod} mDrawState = DRAW_PENDING
06-10 19:02: 23.155 1571 16310 D PipManager: onImeVisibilityChanged - imeVisible: true imeHeight: 0
06-10 19:02: 23.155 1571 16310 D PipManager: onMovementBoundsChanged
06-10 19: 02: 23.160 1566 1566 I SKBD: alf [PF_KL] [SIIC] getSelectedText выполнено 6
06-10 19:02: 23.160 1566 1566 E SKBD: bbd [USICM] [getSelectedText] обновлен, но возвращается значение null
06-10 19: 02: 23.162 1566 1566 I SKBD: alf [PF_KL] [SIIC] getTextBeforeCursor [127] done 2
06-10 19: 02: 23.165 1566 1566 I SKBD: alf [PF_KL] [SIIC] getTextAfterCursor [127] done 2
06-10 19: 02: 23.166 1566 1566 I SKBD_Performance: [IIManager] [PF_KL] IIfo BuildTime - takeTime: 0
06-10 19: 02: 23.168 1571 1908 D PipManager: onImeVisibilityChanged - imeVisible: true imeHeight: 494
06-10 19:02: 23.168 1571 1908 D PipManager: onMovementBoundsChanged
06-10 19:02: 23.169 5555 5555 D ViewRootImpl @ e872005 [MainActivity]: MSG_RESIZED: frame = Rect (0, 0-800, 1280) ci = Rect (0, 32-0, 494) vi = Rect (0, 32-0, 494) или = 1
06-10 19: 02: 23.171 1566 1566 I SKBD: azw getNetworkState: 2
06-10 19: 02: 23.172 1566 1566 I SKBD_Performance: [IIManager] [PF_KL] IIfo BuildTime - takeTime: 0
06-10 19: 02: 23.181 1094 6754 V WindowManager: Окно Relayout {59011d4 u0 com.keyotech.testflutter / com.keyotech.testflutter.MainActivity}: viewVisibility = 0 req = 800x1280 WM.LayoutParams {(0,0) (fillxfill ) sim = 110 ty = 1 fl = # 81810100 pfl = 0x20000 fmt = -3 wanim = 0x1030001 vsysui = 0x700 needsMenuKey = 2 colorMode = 0 naviIconColor = 0}
06-10 19: 02: 23.196 5555 5555 D ViewRootImpl @ e872005 [MainActivity]: Relayout возвращено: old = [0,0] [800,1280] new = [0,0] [800,1280] result = 0x1 surface = {valid = true 2382137344} изменено = false
06-10 19: 02: 23.197 479 479 I SurfaceFlinger: Показать 0 слоев HWC:
06-10 19: 02: 23.197 479 479 I SurfaceFlinger: тип | ручка | флаг | формат | исходная культура (l, t, r, b) | рамка | имя
06-10 19: 02: 23.197 479 479 I SurfaceFlinger: ------------ + -------------- + ------ + - --------- + ---------------------------- + ----------- ---------- + ------
06-10 19: 02: 23.197 479 479 I SurfaceFlinger: Устройство | 0xa90a9100 | 0002 | RGBA_8888 | 0,0 0,0 800,0 1280,0 | 0 0 800 1280 | SurfaceView - com.keyotech.testflutt [...] utter.MainActivity @ c5eb781 @ 0 [5555] # 0
06-10 19: 02: 23.197 479 479 I SurfaceFlinger: Устройство | 0xa90a9400 | 0000 | RGBA_8888 | 0,0 0,0 800,0 32,0 | 0 0 800 32 | com.keyotech.testflutter / com.keyotech.testflutter.MainActivity [5555] # 0
06-10 19: 02: 23.197 479 479 I SurfaceFlinger: Устройство | 0xa90a9080 | 0000 | RGBA_8888 | 0,0 0,0 800,0 631,0 | 0 649 800 1280 | InputMethod [1566] # 0
06-10 19: 02: 23.197 479 479 I SurfaceFlinger: Устройство | 0xa90a9480 | 0000 | RGBA_8888 | 0,0 0,0 800,0 32,0 | 0 0 800 32 | StatusBar [1571] # 0
06-10 19: 02: 23.197 479 479 I SurfaceFlinger:
06-10 19:02: 23.260 1094 1651 E Watchdog: @Sync 29140 [2019-06-10 19: 02: 23.260]
06-10 19:02: 23.319 1094 1121 D CustomFrequencyManagerService: releaseDVFSLockLocked: Получение блокировки типа frm List: DVFS_MIN_LIMIT частота: 1094400 uid: 1000 pid: 1094 tag: com.sec.android.inputmethod@35
06-10 19:02: 23.797 1824 1824 D io_stats:! @ 179,0 r 554029 22731934 w 1087505 19387128 d 87448 30637640 f 326046 326037 iot 2055220 2348326 th 51200 0 0 pt 0 inp 0 0 874428.354
06-10 19: 02: 28.803 1824 1824 D io_stats:! @ 179,0 r 554029 22731934 w 1087515 19387260 d 87449 30637676 f 326047 326038 iot 2055220 2348340 th 51200 0 0 pt 0 inp 0 0 874433.360
06-10 19: 02: 29.163 683 30287 V APM_AudioPolicyManager: getAudioPolicyConfig: audioParam; outDevice
06-10 19: 02: 29.163 683 30287 V APM_AudioPolicyManager: getNewOutputDevice () выбранное устройство 0
06-10 19: 02: 29.163 683 30287 V APM_AudioPolicyManager: ### curdevice: 2
06-10 19: 02: 29.163 1094 4176 D SSRM: i: AudioType = 2, Vol = 0
06-10 19: 02: 29.271 1094 4176 D TelephonyManager: getAllCellInfo: Вызывающий абонент (PID / UID / TID): 1094/1000/4176
06-10 19: 02: 29.291 1094 4176 D SSRM: c: SIOP :: AP: 327 (331,0) BAT: 322 (322,0) CHG: 0 (0,0) ATC: 0 (0,0)
06-10 19:02: 32.115 1094 1147 В MARsPolicyManager: updateFromMARsThread
06-10 19:02: 32.116 1094 1148 D MARsDBManager: updatePkgsToSMDB: begin --size 1
06-10 19:02: 32.132 1094 1148 D MARsDBManager: updatePkgsToSMDB: end
06-10 19:02: 32.132 1094 1148 D MARsDBManager: onChange - mSmartManagerObserver! Uri = content: //com.samsung.android.sm/AppFreezer? MARs-self = true & MARs = true
06-10 19:02: 32.287 1094 1257 D SensorService: [SO] 0,002 0,145 10,047
06-10 19:02: 33.808 1824 1824 D io_stats:! @ 179,0 r 554030 22731938 w 1087527 19387308 d 87449 30637676 f 326047 326038 iot 2055220 2348347 th 51200 0 0 pt 0 inp 0 0 874438.364
06-10 19:02: 38.813 1824 1824 D io_stats:! @ 179,0 r 554030 22731938 w 1087531 19387336 d 87449 30637676 f 326048 326039 iot 2055220 2348353 th 51200 0 0 pt 0 inp 0 0 874443.369
06-10 19: 02: 39.302 683 30287 V APM_AudioPolicyManager: getAudioPolicyConfig: audioParam; outDevice
06-10 19: 02: 39.302 683 30287 V APM_AudioPolicyManager: getNewOutputDevice () выбранное устройство 0
06-10 19: 02: 39.302 683 30287 V APM_AudioPolicyManager: ### curdevice: 2
06-10 19: 02: 39.302 1094 4176 D SSRM: i: AudioType = 2, Vol = 0
06-10 19: 02: 39.324 1094 4176 D SSRM: c: SIOP :: AP: 327 (330,0) BAT: 322 (322,0) CHG: 0 (0,0) ATC: 0 (0,0)
06-10 19:02: 39.577 1094 1378 D WifiTrafficPoller: TrafficStats TxPkts = 145921 RxPkts = 212115 TxBytes = 49347685 RxBytes = 191056925, Foreground uid = 10157 pkgName = com.keyotech.testflutter14BxBytes = 11 rxBytes = 1188xBytes
06-10 19: 02: 39.799 1094 6592 D BatteryService:! @BatteryListener : batteryPropertiesChanged!
06-10 19: 02: 40.024 1094 1291 D InputReader: событие ввода (5): значение = 1, когда = 874444581494000
06-10 19: 02: 40.024 1094 1291 D InputReader: событие ввода (5): значение = 1, когда = 874444581494000
06-10 19: 02: 40.024 1094 1291 I InputReader: действие события касания - 0x0 (deviceType = 0) [pCnt = 1, s = 0,789] при = 874444581494000
06-10 19: 02: 40.024 1094 1290 I InputDispatcher: Доставка касания на (1571): действие: 0x4, toolType: 1
06-10 19: 02: 40.024 1094 1290 I InputDispatcher: Доставка касания на (1566): действие: 0x0, toolType: 1
06-10 19:02: 40.025 1566 1566 D ViewRootImpl @ 6844e5e [InputMethod]: указатель ViewPostIme 0
06-10 19:02: 40.027 1094 1290 D PowerManagerService: [api] userActivityFromNative: 10 (событие: 2 флага: 0) eventTime = 874444581
06-10 19:02: 40.029 1566 1566 E SKBDC: SSLanguageModelManager buildContextualCLM () :: Word Вероятность равна нулю
06-10 19:02: 40.029 1566 1566 I SKBD: bnd [PF_KL] [getKeyIndexAndNearbyCodes] 411822, в Tyme, getSimpleKeyIndexAndNearbyCodes
06-10 19:02: 40.033 1566 1566 I SKBD_Performance: AbstractKeyboardView [PF_KL] onTouchEvent 0 5 4 4875312
06-10 19:02: 40.034 1566 1566 I SKBD_Performance: AbstractKeyboardView [PF_OP] onDraw 36302
06-10 19: 02: 40.064 1094 1291 D InputReader: событие ввода (5): значение = 0, когда = 874444621591000
06-10 19: 02: 40.064 1094 1291 D InputReader: событие ввода (5): значение = 0, когда = 874444621591000
06-10 19: 02: 40.064 1094 1291 I InputReader: действие события касания - 0x1 (deviceType = 0) [pCnt = 1, s =] when = 874444621591000
06-10 19: 02: 40.064 1094 1290 I InputDispatcher: Доставка касания на (1566): действие: 0x1, toolType: 1
06-10 19:02: 40.065 1566 1566 D ViewRootImpl @ 6844e5e [InputMethod]: указатель ViewPostIme 1
06-10 19: 02: 40.071 1566 1566 I SKBD: alf [PF_KL] [SIIC] getTextBeforeCursor [2] done 1
06-10 19: 02: 40.072 1566 1566 I SKBD: alf [PF_KL] [SIIC] getTextBeforeCursor [127] выполнено 1
06-10 19: 02: 40.073 1566 1566 I SKBD: alf [PF_KL] [SIIC] getTextAfterCursor [127] done 1
06-10 19: 02: 40.074 1566 1566 I SKBD_Performance: [IIManager] [PF_KL] IIfo BuildTime - takeTime: 0
06-10 19: 02: 40.077 1566 1566 I SKBD: alf [PF_KL] [SIIC] getExtractedText выполнено 2
06-10 19: 02: 40.079 5555 5555 E SpannableStringBuilder: SPAN_EXCLUSIVE_EXCLUSIVE промежутки не могут иметь нулевую длину
06-10 19: 02: 40.079 5555 5555 E SpannableStringBuilder: SPAN_EXCLUSIVE_EXCLUSIVE промежутки не могут иметь нулевую длину
06-10 19: 02: 40.079 1566 1566 I SKBD: [IIManager] IIfo SI [il: 0x656e4742] [p: 1] [c: 1] [t: 1] [im: 0/0/0/0/0/0 / 0] [sC: 0] [aC: 1] [sS: 0] [aS: 1] [AP: 1] [pW: 0] [eM: 0] [uR: 0] [acI: 0] [iT : 8001] [iO: 2000006] [pID: 5555] [pO: null]
06-10 19: 02: 40.079 1566 1566 I SKBD: [IIManager] IIfo II [ir: 0] [rand: b8d870a07e094cc9a48dc5687ec7e6d8] [hC: 0] [hI: 0] [tr: 0] [tc: 1] [long : 0] [cpl: 2] [xyD: 0 / -2] [xycD: -14 / -11] [kWHG: 63/75/8] [tD: 40] [tP: 13] [fil: true] [ IC: 9/20] [cB: 6/1]
06-10 19: 02: 40.080 1566 1566 I SKBD: alf [SIIC] setComposingText: true, 1
06-10 19: 02: 40.080 1566 1566 I SKBD: [ATIM] [PF_KL] [onCharacterKey] 11
06-10 19:02: 40.080 1566 1566 I SKBD: apf [PF_KL] [onKeyHandleNormalKey :: onCharacterKey] 11564479
06-10 19: 02: 40.080 1566 1566 I SKBD: ako [PF_KL] [onKey] 12110468
06-10 19:02: 40.081 1566 1566 I SKBD_Performance: AbstractKeyboardView [PF_KL] onTouchEvent 1 2 15 15242968
06-10 19:02: 40.081 1566 1566 I SKBD_Performance: AbstractKeyboardView [PF_OP] onDraw 25365
06–10 19: 02: 40.099 1566 1566 I SKBD: [ATIM] [updateSelectionForInputModule] oldSelStart: 1, oldSelEnd: 1, newSelStart: 3, newSelEnd: 3, кандидатыStart: 1, кандидатыEnd: 3, viewClicked: false
06-10 19:02: 40.099 1566 1566 I SKBD: [ATIM] [updateSelectionForInputModule] isTyping: true, viewClicked: false, isKBDShown: true
> 06-10 19: 02: 40.104 5555 5584 Я трепещу: новый текст -> aad
06-10 19:02: 40.128 1566 1566 E SKBD: bbl Отклонить keyPreviewView имеет значение null612>

Если вы хотите изучить нашу обработку ввода текста Android, вы можете взглянуть на shell / platform / android / io / flutter / plugin / edit / InputConnectionAdaptor.java и TextInputPlugin.java.

Я мог представить себе, что прогнозируемый текст Samsung использует текстовые API / обратные вызовы Android странным или непреднамеренным образом, заставляя нас неверно интерпретировать предсказанные слова или части предсказанных слов в качестве дополнительных входных данных. Тем не менее, мы все равно должны найти способ поддерживать клавиатуры Samsung без негативного воздействия на другие платформы.

Итак, вот что я обнаружил на своем пострадавшем устройстве Samsung.
Мой тестовый пример:
1) Коснитесь TextEdit
2) 'abc def'
3) Хит Готово
4) 'г'
5) Виджет показывает abd defdefg

Я использовал сборку движка, чтобы отследить, что здесь происходит, и думаю, что точно определил нужную область.

InputConnectionAdaptor при вызове updateEditingState () кажется, сообщает неверную информацию на устройстве Samsung - в отличие от моего Pixel 3.

Pixel 3 (который работает правильно) во время теста abc def:

mImm.updateSelection (mFlutterView,
selectionStart, selectionEnd,
composingStart, composingEnd);

selectionStart = 7
selectionEnd is = 7
composingStart = 4
composingEnd = 7

При ударе g:

mImm.updateSelection отправляются следующие параметры:

selectionStart = 8
selectionEnd = 8
composingStart = 4
composingEnd = 8

Приводит к правильному "abc defg"

На моем затронутом устройстве Samsung вводится тот же тест abc def:

mImm.updateSelection отправляет следующие параметры:

selectionStart = 7
selectionEnd is = 7
composingStart = -1
composingEnd = -1

При ударе g:

selectionStart = 11
selectionEnd = 11
composingStart = 7
composingEnd = 11

Результат - дублированный текст: 'abc defdefg'

Итак, я предполагаю, что это связано с тем, что начало и конец композиции получают отрицательные числа. Буду продолжать устранение неполадок, но я пока на этом не остановился.

В настоящее время я тестирую некоторый обходной код и думаю, что поделюсь дополнительными выводами для заинтересованных сторон.

На моем затронутом устройстве Samsung beginBatchEdit, по-видимому, вызывается дважды, когда изменяется Editable. К сожалению, первый вызов реализации этого метода в Samsung приводит к появлению Log.e с сообщением «SPAN_EXCLUSIVE_EXCLUSIVE spans не могут иметь нулевую длину». Хотя это может быть или не быть важным, важно то, что эта ошибка указывает на предотвращение любой другой логики, которая должна произойти, и приводит к возврату начального и конечного значения индекса -1, что еще хуже, внутренняя CharSequence Editable имеет теперь поместите в него дублированный текст. Я думаю, что происходит то, что текущий диапазон не удаляется, а вместо этого просто добавляется новый диапазон, который должен его заменить ...?

Итак, вернемся в страну трепета, когда InputConnectionAdaptor.java вызывает updateEditingState, мы не можем доверять методу .toString () для возврата ожидаемой строки из Editable, поскольку мы отправляем ее в textInputChannel.updateEditingState.

Мой обходной путь, работа над которым еще не завершена и требует дополнительного тестирования, заключается в том, чтобы вручную исправить слово / диапазон и заменить его строкой composingText, которая редактируется на основе позиций курсора в базовом редактируемом файле Editable. Первоначальная работа здесь показывает, что это работает до сих пор, по крайней мере, на моем устройстве Samsung, я также вручную исправляю начальный и конечный индекс составления (потому что кто знает, на что еще это может повлиять).

Думаю, это оставляет открытым несколько вопросов. Во-первых, я работаю над ошибкой или функцией в реализации Saumsung (я склоняюсь к ошибке) ... и, вероятно, что более важно, даже если Samsung исправит это, вполне вероятно, что это никогда не будет исправлено в больших большинство устройств, на которые он влияет.

Достаточно сказать, что я на 99% уверен, что это не проблема Flutter, а проблема реализации Android производителем. Я думаю, что мы можем обойти это, хотя я не уверен, в какой степени Flutter должен работать с такими вещами? Конечно, это предполагает, что я правильно понимаю большую часть / все, что нужно знать о том, как Flutter правильно взаимодействует с методами и каналами ввода Android; Возможно, я что-то упустил в отношении того, как мы взаимодействуем с лежащим в основе Editable, хотя я вполне уверен в том, что видел до сих пор.

Тем не менее, я постараюсь обойтись и протестировать его как на устройствах Samsung, так и на других устройствах, конечно же, поделившись всеми результатами.

@GaryQian , есть еще какие-нибудь идеи?

Спасибо за всю вашу работу над этим. Это действительно серая зона при работе с хаками для исправления конкретных ошибок устройства. А именно, если само устройство исправит ошибку, сможем ли мы справиться с ней должным образом? А с точки зрения гигиены кода, наполнение нашей кодовой базы хакерскими атаками делает ее очень труднодоступной и со временем может привести к снижению производительности.

Как вы думаете, возможно ли получить исправление / обходной путь для этого в форме плагина? Было бы феноменально, если бы люди могли просто установить плагин Samsung keyboard fix , который исправит это.

Очень признателен за изучение этой темы!

Я согласен с тем, что ты говоришь, Гэри. Однако несколько напрашивается вопрос, на какие устройства Samsung это влияет, а на какие нет? Я имею в виду, что здесь может быть довольно серьезная проблема распространенности, которую, возможно, необходимо тщательно взвесить. Насколько я понимаю, устройства Samsung довольно популярны в пространстве Android, и люди, пытающиеся развернуть приложения Flutter, видя такое странное поведение, могут неправильно понять.

Тем не менее, я формализирую свой обходной путь в движке для проверки, чтобы вы, ребята, могли лучше понять, в чем дело.

Я, вероятно, мог бы подумать о создании плагина, хотя я не совсем уверен, как бы переопределить функциональность, найденную в InputConnectionAdaptor? В настоящее время я добавляю одну новую функцию, которая переопределяет стандартное поведение в updateEditingState, которое, похоже, работает как для устройств Samsung, так и для других устройств. Мне нужно больше тестов, но то, что у меня есть, довольно многообещающее, хотя и не очень элегантное и некрасивое.

У меня под рукой есть galaxy s8 и galaxy s9
Думаю, это проблема всех новых операционных систем Самсунг. На данный момент наши метрики показывают широкое распространение Samsung среди пользователей. Это важная площадка.

Помогите пожалуйста решить эту проблему. Наши программисты с этим не справляются (

Да, из-за рыночной доли устройств Samsung, если это не может быть применено на уровне ядра, может быть разумным пойти дальше и применить исправление, если оно совместимо как с ошибкой Samsung, так и с правильными версиями.

Я соберу несколько мнений по этому поводу, когда вы опубликуете свой пиар!

Итак, я тестировал свою работу ... она выглядит неплохо, но необходимые изменения, вероятно, не то, что вы хотели бы применить на уровне движка; как уже упоминалось, этим мы, вероятно, возьмем на себя технический долг.

Параметры? Что ж, вместо этого я сейчас работаю над тем, чтобы добавить часть исходного кода Android для Editable и SpannableStringBuilder, внести в него некоторые изменения, а затем вместо этого включить его в движок. Идея состоит в том, чтобы локально исправить, так сказать, сломанные части и использовать исправленные версии для того, что уже ожидает Flutter. Я знаю, что когда много лет назад я делал небольшой игровой движок, который охватывал iOS, Android, Windows и т. очень виноват в этом, хотя, к счастью, сегодня все не так плохо, как тогда).

Я еще не продвинулся далеко в этом, так как меня сбило с толку кое-что тривиальное - как добавить новые файлы .java в сценарии сборки ниндзя? Я продолжаю получать ошибки "пакет не найден" для моих новых файлов java. Я помещаю файлы в то же место, что и ссылочные файлы, и помещаю их в тот же пакет, чтобы они были видны - хотя, может быть, мои файлы не компилируются?

@GaryQian @justinmc ? Здесь есть указатели?

Я бы подумал, что это должно сработать для добавления нового java-файла ... Надеюсь, у @GaryQian есть несколько советов :)

Вы смотрели shell / platform / android / BUILD.gn?

Обычно мы включаем файлы в различные файлы BUILD.gn, разбросанные по сторонам.

Хорошо, спасибо @GaryQian. Я все еще новичок в том, как работают ниндзя; Я все еще приезжаю из прошлого в make-файлы, а что нет. Я начну с этого и скоро представлю результаты, решения и PR.

Не уверен, что это поможет, но для меня следующий обходной путь устранил проблему с дублированием текста на Samsung S8:

    override fun createFlutterView(context: Context?): FlutterView {
        val flutterView = object: FlutterView(this, null, createFlutterNativeView()) {

            override fun onCreateInputConnection(outAttrs: EditorInfo?): InputConnection? {
                val connection = super.onCreateInputConnection(outAttrs)

                outAttrs?.apply {
                    var type = InputType.TYPE_CLASS_TEXT               or
                               InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS or
                               InputType.TYPE_TEXT_VARIATION_PASSWORD

                    if ((inputType and InputType.TYPE_TEXT_FLAG_MULTI_LINE) != 0) {
                        type = type or InputType.TYPE_TEXT_FLAG_MULTI_LINE
                    }

                    if ((inputType and InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS) != 0) {
                        type = type or InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS
                    }

                    if ((inputType and InputType.TYPE_TEXT_FLAG_CAP_WORDS) != 0) {
                        type = type or InputType.TYPE_TEXT_FLAG_CAP_WORDS
                    }

                    if ((inputType and InputType.TYPE_TEXT_FLAG_CAP_SENTENCES) != 0) {
                        type = type or InputType.TYPE_TEXT_FLAG_CAP_SENTENCES
                    }

                    inputType = type
                }

                return connection
            }

        }

        setContentView(flutterView, ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT))

        return flutterView
    }

Этот код необходимо добавить в основную деятельность

Спасибо за комментарий @ 33-Elephants, но похоже, что вы программно форсируете TYPE_TEXT_FLAG_NO_SUGGESTIONS для всех входов (что повлияет на все устройства, а не только на samsung). Ранее и в других местах обсуждалось, что ручное отключение интеллектуального ввода текста на затронутых устройствах Samsung позволяет обойти проблему. Ваше решение, похоже, делает это без того, чтобы пользователь отключал это вручную, но оно также эффективно отключит предложения / прогнозирующий текст для всех пользователей вашего приложения, независимо от устройства, без возможности их включения.

Что до меня, то я был вынужден некоторое время поработать над более приоритетными задачами с моими собственными приложениями для работы с флаттером. В последний раз, когда я работал над этим, все сводилось к тому, что я загрузил исходный код ОС Android для SpannableStringBuilder (и его зависимостей), написал над ним собственный код и попытался протестировать исправления на этом уровне - как и ожидалось, это намного сложнее, чем Я изначально подумал.

В общем, похоже (но не полностью доказано) на затронутых устройствах Samsung есть какая-то неправильная реализация SpannableStringBuilder от AOS.

Итак, у меня есть обходной путь, при котором я вручную исправляю составные строки, когда текст попадает на виджет ввода ... но я думаю, что "правильный", но гораздо сложнее, ответ состоит в том, чтобы вручную переопределить ошибочную реализацию AOS ... это не такая небольшая задача, как я надеялся.

Я, наконец, набрался смелости, чтобы взглянуть на FlutterJNI, потому что это то, к чему мы стремимся.
@ matthew-carroll, если у вас есть какие-либо указания о том, как лучше всего использовать FlutterJNI в отношении реализации ArrayUtils / unpaddedarray (среди других функций, которые, по-видимому, в основном присутствуют в android.internal.util. *) ... все это зависит от SpannableStringBuilder .. .и если я накатываю кастомную реализацию ...

@charlesokt, можете ли вы описать виды изменений, которые вы пытаетесь внести во FlutterJNI? Крайне редко требуются какие-либо изменения для этого интерфейса, особенно когда дело доходит до настройки поведения ввода текста. Я ожидаю, что любые такие корректировки произойдут в TextInputPlugin и InputConnectionAdapter .

@charlesokt, можете ли вы описать виды изменений, которые вы пытаетесь внести во FlutterJNI? Крайне редко требуются какие-либо изменения для этого интерфейса, особенно когда дело доходит до настройки поведения ввода текста. Я ожидаю, что любые такие корректировки произойдут в TextInputPlugin и InputConnectionAdapter .

Вы должны простить мое невежество по поводу всего этого ... то, что начиналось как проблема "должно быть легко взглянуть", вышло далеко за рамки моих первоначальных предположений ... Я только начинаю изучать что-либо о фреймворк и движок, и до всего этого я даже не смотрел на код движка, думаю, я глубоко погрузился в середину океана. Вот общая краткая версия того, что происходит:

Вы определенно правы, FlutterJNI - это не то, что нужно менять; Я нашел свой путь там, пытаясь ответить на вопрос, как я могу добавить собственный код c / c ++ в движок, в частности, для замены или дополнения android.internal.util. методы и функции. Почему? Поскольку затронутые устройства Samsung из-за этой проблемы (и связанных проблем), SpannableStringBuilder выдает внутренние ошибки при вводе текста в виджет ввода текста, в результате чего TextInputPlugin и / или InputConnectionAdapter получают и обрабатывают неверные значения как часть редактируемого объекта. Я думаю, что произошло во время синтаксического анализа SpannableString, в середине обработки произошла ошибка пораженных устройств, внутреннее состояние осталось только наполовину обработанным, а остальная часть флаттера использует неверный ввод.

Более конкретно: TextInputPlugin.java имеет частный метод setTextInputClient, в котором создается объект mEditable, к сожалению, именно этот объект зависит от SpannableStringBuilder и является источником проблем в этой проблеме ... поэтому я должен поддерживать идею, что эти устройства имеют неправильную реализацию исходного кода Android ... и вероятность того, что Samsung выпустит исправление и применит его ко всем затронутым устройствам, вероятно, невелика ... учитывая распространенность скорости развертывания этого производителя, это хороший шанс, что эта ошибка какое-то время повлияет на приложения Flutter.

Итак, вот и мы, я должен развлечь идею создания настраиваемого класса Editable для TextInputPlugin с использованием настраиваемого / надежного SpannableStringBuilder, который зависит от ArrayUtils и других вещей ... стандартные классы в значительной степени полагаются на функции android.internal.util, в основном для манипуляции с массивами, но я не могу добраться до этих вещей как есть, и, конечно же, большая часть этого материала является частным, а в java я не могу наследовать / переопределять их, не написав свой собственный код для замены их в первую очередь ...

Мне нужны рекомендации по нескольким вопросам:

1) Предоставляет ли движок флаттера аналогичные функции для android.internal.util - я предполагаю, что большая часть этого будет кодом JNI / NDK c / c ++, имеющим дело с операциями с памятью.

2) Как мне добавить новый собственный код в движок для поддержки моего нового пользовательского Java-класса SpannableStringBuilder / ArrayUtils. Я не боюсь C / C ++ или JNI, но я не уверен, где начать добавлять этот тип кода. Каковы правила и этикет в этой области, я бы предположил, что мы, вероятно, не хотим просто добавлять новые файлы c в какой-то случайный каталог и случайно пытаться запустить его.

Да, я, вероятно, мог бы создать подходящий Java-код для обработки пользовательского ArrayUtils ... но, учитывая, что исходный код Android обращается к самому нативному, я предполагаю, что показатели производительности будут далеко не идеальными. The Right Way, вероятно, также станет кастомным.

Я полагаюсь на @ jason-simmons и @chinmaygarde относительно добавления кода C ++.

Я также рекомендую вам изучить каждое решение на основе Java, прежде чем переходить на территорию C ++.

CC @gspencergoog для более глубоких знаний о вводе текста.

CC @Hixie для любых позиций политики, связанных с исправлением неисправного поведения в наборе устройств под конкретным OEM.

Спасибо, Мэтью! Я с нетерпением жду дальнейших указаний, и я знаю, что все вы, ребята, действительно заняты всем, что связано с Flutter, поэтому я ценю то, что вы потратили время, чтобы подержать этого выскочку!

Если мы сможем заставить устройства Samsung работать при правильном использовании протокола, то давайте это сделаем (даже если это требует очень специфических искажений). Если мы не можем, но можем надежно обнаружить плохое поведение и отреагировать соответствующим образом, давайте сделаем это. Если мы тоже не можем этого сделать, то более вероятно, что нам просто не следует ничего делать.

Мы определенно не должны делать ничего, что привело бы к плохому поведению, когда устройство все делает правильно.

Что бы мы ни делали, мы должны тщательно задокументировать и протестировать поведение, чтобы кто-то через два года мог понять это и уверенно реорганизовать код без регрессов.

Спасибо за понимание @Hixie. Вот код обхода с объяснением. Я считаю, что создание и поддержка флаттера SpannableStringBuilder, вероятно, является лучшим и долгосрочным способом гарантировать согласованность между устройствами; но, конечно, где эта черта проведена. Тем не менее, вот что мне нужно для обработки входящего плохого ввода.

InputConnectionAdaptor.java

<strong i="8">@Override</strong>
    public boolean setComposingText(CharSequence text, int newCursorPosition) {
        boolean result;
        if (text.length() == 0) {
            result = super.commitText(text, newCursorPosition);
        } else {
            result = super.setComposingText(text, newCursorPosition);
        }
        updateEditingStateWithComposingText(text);
        return result;
    }


private void updateEditingStateWithComposingText(CharSequence composedWord) {
        if (composedWord == null) {
            updateEditingState();
            return;
        }

        int selectionStart = Selection.getSelectionStart(mEditable);
        int selectionEnd = Selection.getSelectionEnd(mEditable);

        int composingStart = BaseInputConnection.getComposingSpanStart(mEditable);
        int composingEnd = BaseInputConnection.getComposingSpanEnd(mEditable);

        String editableStr = mEditable.toString();

        int indexWordBoundary = 0;
        for (int i = selectionStart-1; i > 0; --i) {
            if (editableStr.charAt(i) == ' ') {
                indexWordBoundary = i+1;
                break;
            }
        }

        if (composingStart < 0 && composedWord != null)
            composingStart = composedWord.length();
        if (composingEnd < 0)
            composingEnd = selectionStart - composingStart;

        if (composedWord.length() == 0) {
            //do nothing, user may have done auto-complete, in which case the editable already did the replacement
        }
        else {
            mEditable.replace(indexWordBoundary, selectionStart, composedWord); //manually correct the word that's being edited
        }

        composingEnd = mEditable.toString().length();

        mImm.updateSelection(mFlutterView,
                             selectionStart, selectionEnd,
                             composingStart, composingEnd);

        textInputChannel.updateEditingState(
            mClient,
            mEditable.toString(),
            selectionStart,
            selectionEnd,
            composingStart,
            composingEnd
        );
    }

Я создал дублирующую функцию updateEditingState, которая принимает CharSequence любого составного слова и вызывает его из setComposingText. Это единственное место, где необходимо вызвать эту специализированную версию (все остальные вызовы updateEditingState продолжают вызывать версию без параметров).

Внутри новой функции updateEditingStateWithComposingText я пытаюсь выяснить, где находится граница слова (я предполагаю, что границы слова обнаруживаются только по пробелам, поэтому мне может потребоваться дополнить способ определения границ слова символами, отличными от пробелов). Оттуда он заменяет слово из обнаруженной границы слова.

По сути, я не могу доверять входящей последовательности символов и изменять редактируемый текст вручную на основе входящего слова.

Это проверено на затронутых и не затронутых устройствах и работает должным образом с включенными функциями интеллектуального ввода текста и без них. Это также работает со словами в середине ввода, а не только с последним словом в тексте, и заменяет их на месте.

Это происходит с моим Galaxy S9. Я ввожу форму электронной почты и заметил странное взаимодействие с расширением "." и клавиши «@» .

1) введите 'a.b' в текстовое поле
2) нажмите "Готово", чтобы свернуть клавиатуру
3) выберите текстовое поле и введите '.c'
Результат _должен быть_ 'abc' , но вместо этого мы получаем 'ababc'

Вот мой код

Widget buildEmailField(){
    return TextFormField(
        keyboardType: TextInputType.emailAddress,
        autocorrect: false,
        decoration: InputDecoration(
            labelText: 'Email Address',
            hintText: '[email protected]'
        ),
        validator: (String value){
            if (!value.contains(emailRegExp)){
                return 'Enter a valid email address.';
            }
            else{
                return null;
            }
        }
    );
}

@charles ,

Не могли бы вы подсказать, как интегрировать ваше решение во флаттер
проект. Спасибо

В пятницу, 19 июля 2019 г., в 15:23 charles [email protected] написал:

Спасибо за понимание @Hixie https://github.com/Hixie . Вот
код обходного пути с объяснением. Я считаю, что создание и
поддержание флаттера SpannableStringBuilder, вероятно, лучше,
долгосрочный способ гарантировать согласованность между устройствами; но где это
линия конечно нарисована. Тем не менее, вот что мне нужно уладить
входящий, плохой ввод.

InputConnectionAdaptor.java

@Override
public boolean setComposingText (текст CharSequence, int newCursorPosition) {
логический результат;
if (text.length () == 0) {
результат = super.commitText (текст, newCursorPosition);
} еще {
результат = super.setComposingText (текст, newCursorPosition);
}
updateEditingStateWithComposingText (текст);
вернуть результат;
}

private void updateEditingStateWithComposingText (CharSequencehibitedWord) {
if (createdWord == null) {
updateEditingState ();
возвращение;
}

    int selectionStart = Selection.getSelectionStart(mEditable);
    int selectionEnd = Selection.getSelectionEnd(mEditable);

    int composingStart = BaseInputConnection.getComposingSpanStart(mEditable);
    int composingEnd = BaseInputConnection.getComposingSpanEnd(mEditable);

    String editableStr = mEditable.toString();

    int indexWordBoundary = 0;
    for (int i = selectionStart-1; i > 0; --i) {
        if (editableStr.charAt(i) == ' ') {
            indexWordBoundary = i+1;
            break;
        }
    }

    if (composingStart < 0 && composedWord != null)
        composingStart = composedWord.length();
    if (composingEnd < 0)
        composingEnd = selectionStart - composingStart;

    if (composedWord.length() == 0) {
        //do nothing, user may have done auto-complete, in which case the editable already did the replacement
    }
    else {
        mEditable.replace(indexWordBoundary, selectionStart, composedWord); //manually correct the word that's being edited
    }

    composingEnd = mEditable.toString().length();

    mImm.updateSelection(mFlutterView,
                         selectionStart, selectionEnd,
                         composingStart, composingEnd);

    textInputChannel.updateEditingState(
        mClient,
        mEditable.toString(),
        selectionStart,
        selectionEnd,
        composingStart,
        composingEnd
    );
}

Я создал дублирующую функцию updateEditingState, которая принимает
CharSequence любого составного слова и вызвать его из
setComposingText. Это единственное место, которое нужно назвать
специализированная версия (все остальные вызовы updateEditingState продолжают вызывать
версия без параметров).

Внутри новой функции updateEditingStateWithComposingText я пытаюсь
выяснить, где граница слова (я предполагаю, что границы слова только
найдено из пробелов, поэтому мне может потребоваться расширить способ определения слова
границы с символами, отличными от пробелов). Оттуда он заменяет
слово из обнаруженной границы слова.

По сути, я не могу доверять входящей последовательности символов и изменять
редактируемый текст вручную, исходя из входящего слова.

Это проверено на затронутых и незатронутых устройствах и работает как
ожидается с включенными функциями интеллектуального ввода текста и без них. Это также
работает со словами в середине ввода, а не только с последним словом в
текст и заменяет их на месте.

-
Вы получаете это, потому что подписаны на эту беседу.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/flutter/flutter/issues/31512?email_source=notifications&email_token=ABX6UOP624IXGAHQAVVAO6LQAGW23A5CNFSM4HH53UVKYY3PNVWWK3TUL52HS4DFVREXWORLVMVO3TUL52HS4DFVREXWORXG63LVMVO3
или отключить поток
https://github.com/notifications/unsubscribe-auth/ABX6UONDUGS43PIHOVB4YJ3QAGW23ANCNFSM4HH53UVA
.

Привет @alesido. Описанное мною решение не встроено в движок, поэтому я полагаю, что если вы хотите его использовать, вам нужно будет поймать исходный код движка флаттера, применить эти изменения и скомпилировать свой собственный движок; затем используйте это в своем проекте флаттера. Вы, вероятно, могли бы воспользоваться моим репо, но у меня нет планов поддерживать мое репо в актуальном состоянии с помощью мастера, так что вам, вероятно, лучше сделать это самому в это время.

Я действительно извиняюсь за то, что снова не работал над этим какое-то время, я снова был действительно занят своей собственной проектной работой и другими жизненными вещами; Я действительно могу работать над этим только тогда, когда мои собственные флаттер-проекты, которые приносят мне деньги, не требуют больших затрат. Когда у меня будет больше времени, я хотел бы заняться большим количеством нативного кода в части движка флаттера для Android. Я нахожусь в точке, где мне просто нужно больше узнать о двигателе, прежде чем я буду полностью уверен в «хорошем» решении этой продолжающейся проблемы.

Конечно, если есть какие-то другие амбициозные разработчики, желающие попробовать решение, во что бы то ни стало, я попытался поделиться тем, что я узнал до сих пор, в этой теме.

Кроме того, я думаю, вы отметили не того Чарльза?

https://github.com/flutter/flutter/issues/29341 Описывает более общий случай, и я считаю, что у меня есть грубая причина. Сейчас я ищу лучший способ исправить это.

У меня была такая же проблема с Samsung Tab s5e. Решил установкой гугл клавиатуры. Я знаю, что это не настоящее решение, но, по крайней мере, вы можете свободно протестировать устройство.

Весьма вероятно, что https://github.com/flutter/engine/pull/12432 исправит это, хотя я еще не проверял напрямую.

Я попытался проверить, но не смог воспроизвести эту проблему! Я пробовал на S6 и на Galaxy Note 9.

Этого исправления движка еще нет на главном канале, но когда оно появится, опубликуйте, если кто-нибудь может подтвердить, происходит ли это все еще или нет!

@seritaApp сообщил о подробных шагах воспроизведения на https://github.com/flutter/flutter/issues/41315#issue -498470521. Я лично не тестировал шаги, но для них это воспроизводится последовательно на всех каналах Flutter (включая мастер с flutter / engine # 12432). Я думаю, что Tab S4 может быть важной частью тестирования.

Протестировано с приложением галереи флаттера на Samsung Galaxy Tab S4

  1. Начни вводить слово
  2. Выйти из режима клавиатуры
  3. Сфокусируйтесь и продолжайте печатать
    Вместо добавления новых символов предыдущее слово повторяется снова.
    Случается даже в приложении галереи, поэтому это не связано с моим кодом.

Изменить: я пытался ввести здесь «слова»
ezgif-4-241b62f05f83

Поскольку ваше исправление явно фильтрует корейский язык, оно может пропускать случаи, когда оно действительно полезно, хотя это все еще не подтверждено, эта ошибка такая же.

Я только что протестировал это на мастере и переключился на корейский язык в настройках клавиатуры. Проблема все еще сохраняется.
Еще я понял, что это происходит, только если включено автозаполнение.

ezgif-4-34131cbd10cf

Я просто дважды проверил точные шаги воспроизведения в https://github.com/flutter/flutter/issues/41315#issue -498470521 на мастере с Note 9, и я не смог воспроизвести его. Я согласен, что это, вероятно, несколько конкретных устройств, таких как Tab S4.

Можете проверить, можете ли вы воспроизвести # 30656? Вероятно, у него та же основная причина.

Я также испытал это на Galaxy S8 и S9.

В пятницу, 27 сентября 2019 г., в 16:34 Джастин МакКэндлесс [email protected]
написал:

Я только что дважды проверил точные шаги воспроизведения в # 41315
(комментарий)
https://github.com/flutter/flutter/issues/41315#issue-498470521 в
master с Note 9, и я не смог его воспроизвести. Я согласен, это наверное
несколько конкретных устройств, таких как Tab S4.

-
Вы получаете это, потому что подписаны на эту беседу.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/flutter/flutter/issues/31512?email_source=notifications&email_token=ACONGQDRM5KGH3LEZNHBUGLQLZU45A5CNFSM4HH53UVKYY3PNVWWK3TUL52-5DFMVREXG43
или отключить поток
https://github.com/notifications/unsubscribe-auth/ACONGQHG4ZJP7BMUJWISZIDQLZU45ANCNFSM4HH53UVA
.

Так кто-нибудь работает над исправлением? Если бы я был разработчиком приложений, это уже было бы причиной не использовать флаттер. Samsung - довольно крупный производитель, и эта ошибка, похоже, присутствует на всех новых устройствах.

В результате исправления https://github.com/flutter/flutter/issues/29341 мы определили, что основной причиной является неправильное использование / интеграция API Android самой клавиатурой samsung. Компания Samsung была уведомлена о проблеме, но неясно, можно ли легко отправить исправление на существующие устройства.

Я еще раз взгляну на это позже на этой неделе, чтобы посмотреть, сможем ли мы воспроизвести это и придумать дополнительные обходные пути / хаки, чтобы этого не произошло. Если у кого-то есть более подробная информация о том, какие устройства воспроизводят это, сообщите нам об этом!

В отличие от # 29341, я не обнаружил этой ошибки ни в одном другом приложении, поэтому определенно есть что-то, что Flutter делает по-другому.
Я попытался установить разные клавиатуры Samsung, чтобы узнать, в какой версии впервые возникла проблема.
https://www.apkmirror.com/apk/samsung-electronics-co-ltd/samsung-keyboard-neural-beta/
https://www.apkmirror.com/apk/samsung-electronics-co-ltd/samsung-keyboard/
Однако я могу установить только версии, которые новее, чем версия моего устройства по умолчанию, и, поскольку у меня уже есть последняя версия, это было бесполезно, но, возможно, кому-то еще повезло больше.
PS: Я также пытался установить его на устройства, отличные от Samsung, пока безуспешно

Изменить: Самая низкая версия, которую мне удалось установить, - это «Neural Beta 3.2.02.1», выпущенная 24 декабря 2018 г. Ошибка воспроизводится там.

Я создал PR, чтобы расширить обходной путь, чтобы охватить все устройства Samsung и языки / языки Android Lollipop и более поздние версии с использованием клавиатуры Samsung. Это кажется эффективным решением проблемы.

https://github.com/flutter/engine/pull/12780

Эта ошибка должна быть временно устранена с помощью временного решения. Пожалуйста, дайте мне знать, если кто-то все еще сталкивается с этим!

Только что сделал апгрейд флаттера на главном канале. Дублирование текста по-прежнему является проблемой, как описано в этой ветке. Проверено на Galaxy Tab 8A (SM T380). @GaryQian

трепещущий доктор -v

[√] Flutter (Мастер каналов, v1.10.12-pre.7, в Microsoft Windows [версия 10.0.18362.356], локаль en-US)
• Flutter версии 1.10.12-pre.7 в c: dev \ fluttersdk \ flutter
• Версия платформы 71497367ef (3 часа назад), 2019-10-04 16:13:43 -0400
• Ревизия двигателя 7d90779bb6
• Dart версии 2.6.0 (сборка 2.6.0-dev.5.0 d6c6d12ebf)

Я думаю, что изменение еще не доведено до мастера. Перешел на версию 1d62160fdb вручную, но до сих пор не исправлено

[✓] Flutter (Channel master, v1.10.12-pre.5, on Linux, locale de_DE.UTF-8)

[✓] Android toolchain - develop for Android devices (Android SDK version 28.0.3)
[✓] Android Studio (version 3.5)
[!] IntelliJ IDEA Community Edition (version 2019.2)
    ✗ Flutter plugin not installed; this adds Flutter specific functionality.
    ✗ Dart plugin not installed; this adds Dart specific functionality.
[✓] Connected device (1 available)

! Doctor found issues in 1 category.
[jofu@jofu-pc flutter_gallery]$ flutter doctor -v
[✓] Flutter (Channel master, v1.10.12-pre.5, on Linux, locale de_DE.UTF-8)
    • Flutter version 1.10.12-pre.5 at /opt/flutter
    • Framework revision 3024053c82 (vor 6 Stunden), 2019-10-04 12:13:36 -0700
    • Engine revision 1d62160fdb
    • Dart version 2.6.0 (build 2.6.0-dev.5.0 7a7dcd1ed9)

[✓] Android toolchain - develop for Android devices (Android SDK version 28.0.3)
    • Android SDK at /home/jofu/Android/Sdk
    • Android NDK location not configured (optional; useful for native profiling support)
    • Platform android-28, build-tools 28.0.3
    • Java binary at: /opt/android-studio/jre/bin/java
    • Java version OpenJDK Runtime Environment (build 1.8.0_202-release-1483-b49-5587405)
    • All Android licenses accepted.

[✓] Android Studio (version 3.5)
    • Android Studio at /opt/android-studio
    • Flutter plugin version 39.0.3
    • Dart plugin version 191.8423
    • Java version OpenJDK Runtime Environment (build 1.8.0_202-release-1483-b49-5587405)

[!] IntelliJ IDEA Community Edition (version 2019.2)
    • IntelliJ at /usr/share/idea
    ✗ Flutter plugin not installed; this adds Flutter specific functionality.
    ✗ Dart plugin not installed; this adds Dart specific functionality.
    • For information about installing plugins, see
      https://flutter.dev/intellij-setup/#installing-the-plugins

[✓] Connected device (1 available)
    • SM T835 • ce03182369165611017e • android-arm64 • Android 9 (API 28)

! Doctor found issues in 1 category.

@GaryQian Может быть, это нужно снова открыть

Попробуй сейчас. Изменение только что внесено в мастер https://github.com/flutter/flutter/commit/43a6626c0c222e55c1d44180c5bceb947e828329
примерно 1 час назад (~ 7 октября, 10:00 по тихоокеанскому стандартному времени)

Если он все еще воспроизводится, не могли бы вы сообщить мне точную конфигурацию / устройство / ОС / клавиатуру / процедуру, на которой вы это видите? Я больше не мог воспроизвести это на своих устройствах, но это все еще могло повлиять на другие.

Только что сделал апгрейд мастер-канала, дублирование текста все равно происходит. Вы можете сделать перекрестную ссылку на мой связанный другой поток, поскольку это тест, который я повторно выполнил после обновления (https://github.com/flutter/flutter/issues/33255).

[√] Flutter (мастер канала, v1.10.13 – pre.19, в Microsoft Windows [версия 10.0.18362.356], локаль en-US)
• Flutter версии 1.10.13-pre.19 в c: dev \ fluttersdk \ flutter
• Версия платформы 2d642e95e1 (64 минуты назад), 2019-10-07 11:02:29 -0700
• Ревизия двигателя 1d62160fdb
• Dart версии 2.6.0 (сборка 2.6.0-dev.5.0 d6c6d12ebf)

Протестировано на исходном устройстве:

Galaxy Tab 8A (2017)
Model Number: SM-T380
Android OS: 8.1.0
Kernel Version: 3.18.71-15756985 (Tue Apr 2 2019)
Build Number: M1AJQ.T380DXU3BSD1
Security Release: Apr-2019
Using stock Samsung Keyboard (not sure how to check it's version)

Я обновил устройство, и проблема все еще существует. Обновленная информация об устройстве:

Galaxy Tab 8A (2017)
Model Number: SM-T380
Android OS: 9
One UI Version: 1.1
Kernel Version: 3.18.120-16521006 (Sat Aug 24 2019)
Build Number: PPR1.180610.011.T380DXU3CSHC
Security Release: Jun-2019
Samsung Keyboard version 3.3.31.14

[✓] Flutter (Channel master, v1.10.14-pre.12, on Linux, locale de_DE.UTF-8)
    • Flutter version 1.10.14-pre.12 at /opt/flutter
    • Framework revision cdc2d9901d (5 hours ago), 2019-10-07 16:43:04 -0700
    • Engine revision 1d62160fdb
    • Dart version 2.6.0 (build 2.6.0-dev.5.0 d6c6d12ebf)
Galaxy Tab S4
Model Number: SM-T835
Android OS: 9
One UI Version: 1.1
Kernel Version: 4.4.153-16555495
Build Number: PPR1.180610.011.T835XXU3BSG4
Security Release: Jul-2019
Samsung Keyboard version 3.3.21.24

Процедура:

  • Убедитесь, что в настройках клавиатуры включено автозаполнение.
  • Сосредоточьтесь на текстовом поле и введите букву (обычную букву, а не цифру)
  • Расфокусируйте текстовое поле, нажав назад (клавиатура должна исчезнуть, фокусировка на другом текстовом поле не приведет к воспроизведению проблемы)
  • Снова сфокусируйтесь на исходном тексте, продолжайте вводить

Прежде всего, спасибо за исследование и попытку исправить эту проблему.

Я только что тестировал его на Galaxy Tab A (SM-T510). Как сообщали другие, проблема, к сожалению, до сих пор не устранена.

Хочу отметить, что на моем устройстве мне не нужно фокусировать-расфокусировать-фокусировать текстовое поле. Проблема присутствует при первоначальном фокусе и вводе.

Вот видео, на котором я пытаюсь ввести [email protected] в форму входа:

Как видите, дублирование происходит только после ввода чего-то следующего за @ или . .

TextFormField имеет autocorrect: false .

Проблема отсутствует, если _Умный набор> Интеллектуальный ввод текста_ был отключен в настройках клавиатуры.

Больше информации:

Galaxy Tab A (2019)
Model Number: SM-T510
Android OS: 9
One UI Version: 1.0
Kernel Version: 4.4.111-15874928
Build Number: PPR1.180610.011.T510XXU1ASEF
Security Release: May-2019
Samsung Keyboard version 3.3.30.68
Device Language: German

Я также тестировал его с телефоном Galaxy A5 (2017), где проблемы нет.

Спасибо @Endebert , ваш тест также запускается на моем Galaxy Tab 8A. Суть проблемы восходит к тому, что я упоминал ранее, похороненному в комментариях выше, что кажется, что ЛЮБОЙ текст "граница слова" вызывает сбой. Думаю, в этом случае @ и. также являются своего рода границами слов (которые не являются фактическими пробелами).

Открытие и закрытие клавиатуры также запускает его. Основная проблема (или одна из основных проблем) может заключаться в том, что клавиатура Samsung не может прочитать текст текстового поля при определенных обстоятельствах. Я думаю, что лучше всего это можно увидеть в # 30656, где обычно область рукописного ввода должна содержать текст ( "Тест") но он просто пустой.
В случае автозаполнения клавиатура пытается прочитать текст после определенных специальных символов, но она просто получает пустую строку и, таким образом, думает, что текстовое поле пустое, и просто снова добавляет всю предложенную строку

Связанная проблема, возможная основная проблема / причина: https://github.com/flutter/flutter/issues/41990

Я подозреваю, что ошибка, которую я исправил с помощью более раннего патча, на самом деле немного отличалась от той, о которой сообщалось здесь. В любом случае, на этот раз я постараюсь воспроизвести именно этот баг.

В настоящее время нам не хватает перечисленных выше устройств, способных воспроизвести это. Я разместил заказы на оборудование, необходимое для перепрограммирования, и немного позже на этой неделе обновлю его с дополнительной информацией!

У нас тоже есть эта проблема. Проверено на S9 и S10 с клавиатурой Samsung. Протестировано на шведском и английском языках.

Воспроизвести:

• На Samsung S9 или S10 (те, которые мы тестировали) установите шведский язык в качестве языка устройства, используйте клавиатуру Samsung, включите интеллектуальный ввод текста в настройках клавиатуры Samsung.
• Откройте приложение Flutter. Введите helloworld @ g , и вы заметите, как дублировался начальный h.

Выводы:

• Нет проблем, если установлен английский язык, только если установлен шведский.
• Работает с предиктивным вводом текста ВЫКЛ.

Это огромная проблема для пользователей, регистрирующих учетные записи . Мы отлаживали проблемы с учетной записью и, наконец, выяснили, что проблема в том, что пользователи имеют нежелательные повторяющиеся первые буквы в их адресах электронной почты, и это основная причина. Для более крупных производственных приложений с процессами регистрации это может считаться серьезной проблемой. Пожалуйста, подайте заявку и пометьте ее соответствующим образом @GaryQian @eseidelGoogle, если это возможно.

Обновление: Прибыли устройства. Смог воспроизвести точную ошибку.

Корень этой ошибки уже отмечен как критический для клиентов, но я тоже добавлю его сюда.

Я предполагаю, что это дополнительная ошибка https://github.com/flutter/flutter/issues/42273.

У меня есть обходной путь, который поможет только некоторым разработчикам:

Если вы можете контролировать объем содержимого, вводимого пользователем, вы можете ограничить это содержимое только числами. Эта ошибка не возникает на моем S8, когда я ввожу числа только с помощью цифровой клавиатуры flutter ( keyboardType: TextInputType.number ).

Я реализовал https://github.com/flutter/flutter/pull/43865, как это было предложено Samsung, но, похоже, это неэффективно для решения этой конкретной проблемы.

Samsung утверждает, что работает над исправлением со своей стороны, но я продолжу искать решение и со стороны Flutter.

Я пробую Flutter (мастер каналов, v1.10.16-pre.114, в Mac OS X 10.15.1 19B88, locale en-AR) на моем Samsung S9 прямо сейчас. (Android версии 9)

Это код:

return TextFormField(
      autocorrect: false,
      keyboardType: TextInputType.text,
      decoration: InputDecoration(hintText: 'e-mail'),
    );

Я начинаю писать несколько букв, пока все в порядке, затем нажимаю @, когда я собираюсь ввести следующую букву, она дублирует текст и добавляет букву в конце.

Пример: я набираю слово user @, когда набираю h, поле обновляется с user @ user @ h

Обратите внимание, что:

  • Это происходит независимо от того, какой язык вы используете. (Я использовал английский, испанский и португальский).
  • Это происходит только при включенном интеллектуальном вводе текста.

Есть какие-нибудь новости по решению этой проблемы? Мы в полном ступоре. Наш проект привязан к созданию текстовых заметок и из-за этой проблемы мы теряем огромную часть аудитории Samsung.

Разработчики, откликнитесь, помогите наконец-то выпустить. Это основная штука .. ввод текста .. Вот уже пол года всем пишу по этому поводу.

Я могу воспроизвести это на бета-канале
[✓] Flutter (бета-версия канала, v1.10.7, в Mac OS X 10.14.6 18G1012, локаль en-US)

Использование Samsung Galaxy Note 9
SM N960U1 • android-arm64 • Android 9 (API 28)

Английский язык
Клавиатура по умолчанию: Samsung Keyboard English (США)

используя TextFormField, который изначально заполнен данными, в данном случае 4 символа алфавитных символов: "Test"

Шаги: (цитаты в приложении не отображаются)
1) Щелкните текстовое поле, чтобы курсор оказался в конце текста: «Тест».
2) нажмите клавишу Backspace, стирая t: "Tes"
3) введите "6": "Tes6"
4) введите "h": "Tes6Tes6h"

Ожидается: последняя строка должна быть «Tes6h», а не «Tes6Tes6h».

В этом примере здесь будет отображена проблема, используя описанные выше шаги (так здорово, что весь код приложения)

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  <strong i="19">@override</strong>
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;

  <strong i="20">@override</strong>
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String _userName = 'Test';

  <strong i="21">@override</strong>
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('Demonstrating Github Issue'),
            Text('https://github.com/flutter/flutter/issues/31512'),
            Text('Issue with repeating text, on Samsung devices'),
            TextFormField(
              decoration: InputDecoration(
                labelText: 'User Name',
              ),
              initialValue: _userName,
              onChanged: (value) {
                print('On Changed ${value.toString()}');
              },
              onSaved: (value) {
                setState(() {
                  _userName = value;
                });
              },
              validator: (value) {
                if (value.trim().isNotEmpty) {
                  return null;
                } else {
                  return 'invalid';
                }
              },
            ),
          ],
        ),
      ),
    );
  }
}

I / flutter (23321): Вкл. Изменено
I / flutter (23321): при изменении теста
I / flutter (23321): при изменении Tes
I / flutter (23321): на измененном Tes6
E / SpannableStringBuilder (23321): промежутки SPAN_EXCLUSIVE_EXCLUSIVE не могут иметь нулевую длину
E / SpannableStringBuilder (23321): промежутки SPAN_EXCLUSIVE_EXCLUSIVE не могут иметь нулевую длину
I / flutter (23321): на поменял Tes6Tes6h

Примечание. Использование keyboardType: TextInputType.visiblePassword было допустимым обходным путем для наших текстовых вводов.

К сожалению, от Samsung об этом пока ничего не известно. Flutter может решить проблему аналогично тому, как мы исправили ошибку ввода корейского языка Samsung на странице https://github.com/flutter/engine/pull/12432.

Я ничего не знаю о внутреннем устройстве флаттера, но почему у нативного приложения нет этой проблемы на устройствах Samsung?

@efreibe Собственные приложения напрямую используют API ввода с клавиатуры Android, тогда как Flutter должен обращаться к нему через IMM (диспетчер методов ввода) и расширение BaseInputConnection. Короче говоря, клавиатура Samsung делает предположения о IMM и выполняет внутреннее кэширование содержимого. Где-то есть несоответствие между тем, что предполагалось, и тем, что видят Flutter / Samsung.

К сожалению, от Samsung об этом пока ничего не известно. Flutter может решить эту проблему аналогично тому, как мы исправили ошибку ввода корейского языка Samsung в

Как это применить в нашем проекте ?? У нас есть русский язык. Использовать просто не реально ...

Примечание. Использование keyboardType: TextInputType.visiblePassword было допустимым обходным путем для наших текстовых вводов.

Большое спасибо за упоминание об этом, это работает и для нас! Теперь мы можем выпустить наше приложение: tada:

Спасибо @GaryQian за разъяснения.

keyboardType: TextInputType.visiblePassword работает, потому что отключает автокоррекцию, в чем и заключается ошибка.

К сожалению, от Samsung об этом пока ничего не известно. Flutter может решить эту проблему аналогично тому, как мы исправили ошибку ввода корейского языка Samsung в flutter / engine # 12432.

Почему в сборку не добавляете обход для русского языка?
Эта идея решит проблему хотя бы временно ..!

keyboardType: TextInputType.visiblePassword работает, потому что отключает автокоррекцию, в чем и заключается ошибка.

@GaryQian, спасибо, что указали на это. Хорошее решение.

Примечание. Использование keyboardType: TextInputType.visiblePassword было допустимым обходным путем для наших текстовых вводов.

TextInputType.visiblePassword не может писать по-корейски😢. (возможно, многие другие азиатские языки тоже)

Какие новости по этому поводу? Это критическая ошибка, эта проблема ставит под сомнение целесообразность использования флаттера в продакшене.

Мы тоже считаем это критической ошибкой. Это одна из приоритетных задач, но главный инженер, работающий в этой области, сейчас занят еще более важным проектом. Мы надеемся рассмотреть это до конца года или, если это не получится, в самом начале следующего года.

А пока мы рады рассмотреть любые исправления, которые хотели бы предложить другие; это проект с открытым исходным кодом, и каждый может внести свой вклад и присоединиться к команде!

Работаем над обходным путем / хаком для этой проблемы. Дублирование происходит, когда IMM устанавливает составляющий текст как все содержимое текстового поля. Это не проблема при наборе текста, так как все слово устанавливается как составная область, а настройка составного текста заменяет всю составляющую область. Однако, когда клавиатура скрыта, область очищается до свернутой области, поэтому теперь, когда текст установлен, все содержимое добавляется до конца, вызывая дублирование.

Чистым решением было бы уведомить IMM о том, что составная область закрыта, или иначе не устанавливать все составляющее содержимое при вводе. Изучаем, как этого добиться.

Гэри, спасибо, что начали над этим работать.
Сразу хочу отметить, что дублирование появляется и в других случаях, когда клавиатура видна.
Например, при наборе «Текст». с точкой в ​​конце, а затем начните вводить без добавления пробела, также появляется дублирование.

screencast 2019-12-16 14-55-00

Вы увидите, что текст дублируется при вводе нового текста.

Усилия по ведению журнала показывают, что, когда вы начинаете вводить поле с незакрепленным содержимым, Gboard устанавливает все содержимое (или, скорее, то, что еще не зафиксировано) в качестве области составления, тогда как Samsung устанавливает область составления (0,0 ).

Поскольку я не могу изменить то, что и как IMM вызывает API, мне, возможно, придется реализовать взлом, возможно, отслеживая содержимое вручную только на Samsung. Хотя это определенно не было бы чистым. Я все еще ищу более предпочтительный способ уведомить IMM о фиксации текста / о том, что ему нужно.

Таким образом, поведение ввода знаков препинания, таких как . и его дублирование, кажется, отделено от ошибки, при которой скрытие клавиатуры и ввода вызывает дублирование. Хотя они, вероятно, связаны, на Galaxy S9 возникает только ошибка пунктуации, а на Galaxy Tab T380 возникает только ошибка скрытия клавиатуры.

Есть ли прогресс в решении проблемы? Заполнили заявку и ждем решения этой проблемы ((
@GaryQian @Hixie

Я столкнулся с этой проблемой при вводе адреса электронной почты со следующим:

TextFormField( autocorrect: false, keyboardType: TextInputType.emailAddress, textInputAction: TextInputAction.done, ...),

Как только я ввожу что-либо после символа @, он дублирует предыдущий текст с добавлением нового текста ...

Это присутствует на Samsung Tab A 10.1 "(2019)

Я столкнулся с той же проблемой и на Samsung Fold.

ezgif-6-5b5717cd0b38

Каким образом клиенты flutter, такие как realtor.com, tencent, alibaba, ebay, capitalone, пытаются обойти это в своих производственных приложениях? В совокупности у этих компаний, вероятно, есть сотни миллионов пользователей телефонов Samsung, на которых может повлиять эта ошибка ввода текста.

Разработали ли они свои собственные текстовые вводы с нуля?

Каким образом клиенты flutter, такие как realtor.com, tencent, alibaba, ebay, capitalone, пытаются обойти это в своих производственных приложениях? В совокупности у этих компаний, вероятно, есть сотни миллионов пользователей телефонов Samsung, на которых может повлиять эта ошибка ввода текста.

Разработали ли они свои собственные текстовые вводы с нуля?

Понятия не имею, что они делают, но у меня есть все поля электронной почты в виде виджета с отслеживанием состояния, который использует пакет информации об устройстве, чтобы проверить, является ли это samsung. Добавьте это в текстовые поля ввода электронной почты:

keyboardType: samsungKeyboard ? TextInputType.visiblePassword : TextInputType.emailAddress,
autoFocus: false,

Автофокус обычно нужно выключить. Если клавиатура поднимается до того, как setState чтобы сделать samsungKeyboard истинным, на самом деле она не изменит тип клавиатуры, пока не закроется и не откроется снова.

Если они попытаются ввести что-либо с веб-сайта, электронной почты или чего-либо со специальным символом, тогда буквы в другие текстовые поля будут дублироваться, и это будет ужасно.

Есть ли прогресс по этому вопросу?

Большинство жалоб от наших пользователей связано с этой проблемой.
Огромное количество наших пользователей используют устройства Samsung и страдают от того, что просто пишут текст.
Написание текста - самая основная функция приложения.
Если он не работает должным образом, это может отрицательно сказаться не только на нашем приложении, но и на репутации Flutter.

Я знаю, что вы работаете над этим, но, пожалуйста, решите эту проблему как можно скорее.
Количество разработчиков и пользователей ждут.

@Kiboom Да, я понимаю. Приносим извинения за любые блокировки / задержки / боль, которые это вызывает. Я изо всех сил пытаюсь разобраться с этим, но это одна из тех проблем, когда все, что я могу сделать, это ткнуть в черный ящик, который является реализацией клавиатуры Samsung, которая кэширует определенные значения иначе, чем любая другая клавиатура. Я могу контролировать только то, как Flutter обрабатывает вызов Samsung API клавиатуры, поэтому существует очень ограниченный набор инструментов / мест, с которыми я могу работать. Прямо сейчас ключевая проблема заключается в том, что в Samsung нам не хватает вызова setComposingRegion, и нет надежного способа, который я могу (пока) получить, чтобы получить эту информацию. Он также сильно различается между версиями, поэтому разные исправления / обходные пути работают только для подмножества устройств.

Как примечание здесь для справки, дублирование пунктуации происходит на S9, но не на Galaxy Tab.

Часть этой ошибки, связанная с дублированием знаков препинания, вызвана тем, что Samsung не сбрасывает внутреннюю кэшированную композиционную область после вызова finishComposingText() , который является методом, который фиксирует и сбрасывает композиционную область. Мне удалось обойти это, вручную отправив на клавиатуру пустую область композиции в переопределенном finishComposingText() . https://github.com/flutter/engine/pull/15701 реализует это.

Подтвержденный текст больше не повторяется в пунктуации. Изменение внесено в основной канал через https://github.com/flutter/flutter/commit/fbb2f07497868a2b63c23abaa31aed02fc13d057.

Есть еще вторая половина ошибки, когда текст дублируется, когда клавиатура скрыта + не скрыта + тип. Это не проходит через кодовый путь finishComposingText и требует другого обходного пути.

Есть какие-нибудь новости?

Пока нет, экспериментирую, но пока не очень. Будет обновлено, когда у меня появится дополнительная информация. Оставшаяся часть этой ошибки вызвана аналогичной проблемой с завершением создания области и тем, как Samsung кэширует ее внутри. Когда клавиатура скрыта, область создания заканчивается, однако Samsung не очищает свой кеш и неправильно восстанавливает его, когда клавиатура снова отображается, что вызывает дублирование. Сложная часть - найти надежный способ уведомить / заставить клавиатуру очистить кеш в общем случае, не нарушая работу других клавиатур.

Давай, @GaryQian. Идти! Ты можешь это сделать!!

Обновление: хак, который я смог использовать для исправления части ошибки "дублирование при пунктуации", не работает с частью этой ошибки "скрытие клавиатуры-отображение дублирования". Я подтвердил, что успешно сбрасываю составляющие области при скрытии / отображении клавиатуры без положительных результатов. Похоже, что это кэшированное значение хранится где-то еще, или Samsung не полностью реализовал получение данных области составления в IME. Продолжаем поиск ...

Я считаю, что у меня есть еще одно частичное исправление, которое устраняет эту ошибку в подавляющем большинстве случаев. Кажется, есть еще третий способ дублирования, но я смог использовать вызов updateSelection IMM, чтобы обмануть клавиатуру и сбросить ее кэшированную область составления в https://github.com/flutter/engine/pull/16547.

Это устраняет дублирование (на моих тестовых устройствах) почти во всех случаях, но в нескольких редких случаях (точные шаги воспроизведения еще предстоит определить) я все еще могу дублировать. Я постараюсь определить текущее состояние взлома / исправления, потому что это важное исправление, и большинство случаев покрывается им.

Частичное решение найдено. https://github.com/flutter/engine/commit/c4c6ef67195bd7b592ede2769702ecb7253e525c По-прежнему необходимо внедрить в структуру, но это должно значительно улучшить поведение дублирования. Пожалуйста, попробуйте его (после того, как он войдет в структуру).

Если кто-то может придумать надежные шаги для воспроизведения оставшегося случая дублирования края, поделитесь, пожалуйста! Я могу воспроизводить это время от времени, но не могу добиться этого постоянно.

Я использовал S10 plus с android 10
Испанский (США) идиома

Сценарий

Коснитесь текстового поля
Введите письмо
Выполнено
Коснитесь текстового поля
Введите точку (.)
Введите любую букву

воспроизвести сегодня 13/2/2020

Вышеприведенное исправление добавлено в главный канал с https://github.com/flutter/flutter/commit/6ecb0521399c3148aaac513921cd51a3e17e56a9 сегодня. Пожалуйста, попробуйте сейчас.

@ccarbajo Вы, вероятно, пробовали версию, в которой исправление не было, так как оно только что добавлено в frtamework, попробуйте сейчас на главном канале :)

Спасибо @GaryQian за ваши усилия. К сожалению, наши вопросы не решаются на основании наших наблюдений.

Мы создали простой пример приложения с этим TextField:

TextField(
  autocorrect: false,
  enableSuggestions: false,
)

Ввод по-прежнему дублируется при вводе буквы после @ или . .

На самом деле, проблема, похоже, усугубилась для нас, так как теперь самый первый набранный символ тоже иногда дублируется, чего раньше не было.

Дублирование первого символа, похоже, связано со скрытием + отображением клавиатуры или изменением фокуса назад и вперед.

Вот короткое видео, показывающее обе проблемы.

ezgif-6-abaec488e429

Устройство - Galaxy Tab A (2019, 10.1). Пробовал как с английским, так и с немецким языками.

трепещущий доктор:

[✓] Flutter (Channel master, v1.15.4-pre.83, on Linux, locale en_US.UTF-8)
    • Flutter version 1.15.4-pre.83 at /opt/flutter
    • Framework revision ec9813a500 (8 hours ago), 2020-02-16 19:15:52 -0800
    • Engine revision d60f298d9e
    • Dart version 2.8.0 (build 2.8.0-dev.9.0 edd64e6d5c)


[✓] Android toolchain - develop for Android devices (Android SDK version 29.0.2)
    • Android SDK at /home/ren/Android/Sdk
    • Android NDK location not configured (optional; useful for native profiling support)
    • Platform android-29, build-tools 29.0.2
    • Java binary at: /home/ren/.local/share/JetBrains/Toolbox/apps/AndroidStudio/ch-0/191.6010548/jre/bin/java
    • Java version OpenJDK Runtime Environment (build 1.8.0_202-release-1483-b49-5587405)
    • All Android licenses accepted.

[✓] Android Studio (version 3.5)
    • Android Studio at /home/ren/.local/share/JetBrains/Toolbox/apps/AndroidStudio/ch-0/191.6010548
    • Flutter plugin version 40.0.2
    • Dart plugin version 191.8423
    • Java version OpenJDK Runtime Environment (build 1.8.0_202-release-1483-b49-5587405)

[✓] Connected device (1 available)
    • SM T510 • R52M400PMFN • android-arm • Android 9 (API 28)

Это реальная проблема. Есть новости с фронта? Сборка с мастером флаттера, проблема не устранена.

@Endebert Спасибо за подробный отчет!

Если кто-то еще не заметил улучшений на главном канале, поделитесь своим flutter doctor а также устройством, на котором обнаружена ошибка: точная модель, версия Android и версия Samsung Experience.

Ошибка улучшилась на множестве моих тестовых устройств, но у меня (пока) нет полной библиотеки устройств Samsung. Если мы сможем сузить оставшееся поведение на подмножестве устройств, я могу купить устройство, чтобы убедиться, что оно на них зафиксировано.

@Endebert Спасибо за подробный отчет!

Если кто-то еще не заметил улучшений, поделитесь своим flutter doctor а также устройством, на котором обнаружена ошибка: точная модель, версия Android и версия Samsung Experience.

Ошибка улучшилась на множестве моих тестовых устройств, но у меня (пока) нет полной библиотеки устройств Samsung. Если мы сможем сузить оставшееся поведение на подмножестве устройств, я могу купить устройство, чтобы убедиться, что оно на них зафиксировано.

  • Я разделяю текущее состояние воспроизведения и подтверждения ошибок, как показано ниже.
    После применения обновления проблемы с дублированием ввода по-прежнему возникают, а недовольство клиентов растет.

  • Воспроизвести эту ошибку

    • время выполнения: 2020-02-11 11:44:36
    • Мне сказали, что дублированный ввод поступает от пользователя, использующего Galaxy s7 и Galaxy s8. Чтобы выяснить это, я купил устройство Galaxy S8. После обновления флаттера до последней версии и создания приложения для проверки проблемы проблема с дублированием ввода не исчезла и все еще возникает. Проблема с дублированием ввода текста - это очень простой и критический недостаток. Это должно быть исправлено как можно скорее, поэтому, пожалуйста ...
      Подбадривая и веря вам ^^
    • Как воспроизвести предложение: После ввода слова опустите и поднимите мягкую клавиатуру. -> После повторного ввода слова нажмите кнопку пробела или подождите некоторое время, чтобы изменить статус ввода на неактивный. -> После этого, когда вы пытаетесь ввести следующее слово, курсор перемещается вперед, и первое слово меняется на второе слово, которое вы ввели ранее. После этого при вводе любого слова начинает вводиться много повторяющихся слов.
    • Возможно, у Samsung Galaxy S7, S8 и S9 все еще есть проблемы с дублированием ввода. Не знаю про S10 и т. Д.
  • Информация о среде разработки
    Flutter 1.12.13 + hotfix.8 • стабильный канал • https://github.com/flutter/flutter.git
    [✓] Android toolchain - разработка для устройств Android (Android SDK версии 29.0.2)
    • Android SDK в / Users / xxx / Library / Android / sdk.
    • Расположение Android NDK не настроено (необязательно; полезно для поддержки встроенного профилирования)
    • Платформа android-29, инструменты сборки 29.0.2
    • Бинарный файл Java находится по адресу: / Applications / Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java.
    • Java-версия OpenJDK Runtime Environment (сборка 1.8.0_202-release-1483-b49-5587405)
    • Принимаются все лицензии Android.
    [✓] Xcode - разработка для iOS и macOS (Xcode 11.3.1)
    • Xcode в /Applications/Xcode.app/Contents/Developer
    • Xcode 11.3.1, версия сборки 11C504
    • CocoaPods версии 1.8.4
    [✓] Android Studio (версия 3.5)
    • Android Studio в / Applications / Android Studio.app/Contents.
    • Плагин Flutter версии 43.0.1
    • Плагин Dart версии 191.8593
    • Java-версия OpenJDK Runtime Environment (сборка 1.8.0_202-release-1483-b49-5587405)
    [✓] Подключенное устройство (доступно 1)
    • SM G950N • xxxxxxxxxxx • android-arm64 • Android 9 (API 28)

Я думаю, вам лучше купить настоящее устройство Galaxy S8, чтобы исправить эту ошибку.
Хорошего дня. Спасибо.

Несколько лет назад, когда я разрабатывал приложение с Firemonkey, я обнаружил несколько ошибок при вводе текста. Фреймворк управления самопричинением очень хорош для разработки интерфейсов, но многие ошибки при вводе текста сводят разработчиков и клиентов с ума. Рекомендуется, чтобы Google в первую очередь сосредоточился на устранении нескольких ошибок при вводе текста. В конце концов, это обязательная функция практически для всех приложений.

@ exptk3 Вы тестируете стабильный канал, в котором нет исправлений. Повторите попытку на главном канале ( flutter channel master ).

Я подтвердил, что он исправлен на следующих тестовых устройствах, которые у меня есть: S7 S9 S10 Note9 (того же поколения, что и s8), а также на различных планшетах, включая Galaxy Tab A 2017 и 2018. У меня также есть доступ к множеству pre-s7 устройства, которые я недавно не пробовал, но эти устройства уже довольно старые, и многие из них изначально не воспроизводили проблему.

Мне удалось воспроизвести версию этой ошибки с пунктуацией на J6 +, которую я откопал (SM J610G / DS). Версия скрытой клавиатуры этой ошибки не возникает.

@ exptk3 Вы тестируете стабильный канал, в котором нет исправлений. Повторите попытку на главном канале ( flutter channel master ).

Я подтвердил, что он исправлен на следующих тестовых устройствах, которые у меня есть: S7 S9 S10 Note9 (того же поколения, что и s8), а также на различных планшетах, включая Galaxy Tab A 2017 и 2018. У меня также есть доступ к множеству pre-s7 устройства, которые я недавно не пробовал, но эти устройства уже довольно старые, и многие из них изначально не воспроизводили проблему.

Хорошо.
Я только что тестировал на мастер-канале. Кстати, проблема с дублированием ввода все еще возникала, и была добавлена ​​еще одна проблема, которой не было.
На то, чтобы клавиатура поднялась и опускалась, требовалось от 3 до 15 секунд или больше (время, необходимое для каждой операции разное).
После того, как клавиатура опускалась и поднималась, проблема с дублированием ввода все еще возникала.
Даже клавиатура, появившаяся после выхода из приложения, находится на главном экране телефона.
Текущая ситуация хуже, чем раньше, поэтому даже пользователи других стран, которые не используют корейскую клавиатуру, могут вызвать проблемы.

* Подтверждена еще одна ошибка
В дополнение к вышесказанному, после применения модификаций главного канала, вход для перехода к следующей строке также был отключен. Это прервется с первого использования текстового поля независимо от клавиатуры вверх и вниз и не перейдет к следующей строке.

Мое тестовое устройство - Galaxy S8, как упоминалось в статье выше.
Пожалуйста, проверьте выше


  • Это мой TextField (ничего особенного)
    Текстовое поле(
    maxLengthEnforced: true,
    maxLength: 500,
    украшение: InputDecoration (
    labelStyle: TextStyle (fontSize: 15),
    labelText: 'xxxxxx',
    hintStyle: TextStyle (
    fontSize: 13, цвет: Colors.grey [400]),
    hintText: 'xxxxxx',
    ),
    контроллер: _xxxxxController,
    keyboardType: TextInputType.multiline,
    maxLines: нуль,
    onChanged: (val) {xxx},

    )

  • Сообщение консоли при подъеме и опускании клавиатуры

    1. клавиатура вниз
      D / ViewRootImpl @ 3eb9136 MainActivity : MSG_RESIZED: frame = Rect (0, 0 - 1080, 2220) ci = Rect (0, 72 - 0, 144) vi = Rect (0, 72 - 0, 144) или = 1
      D / ViewRootImpl @ 3eb9136 MainActivity : Relayout возвращено: old = [0,0] [1080,2220] new = [0,0] [1080,2220] result = 0x1 surface = {valid = true 524530458624} changed = false
  1. клавиатура вверх
    W / IInputConnectionWrapper (21669): getExtractedText при неактивном InputConnection
    W / IInputConnectionWrapper (21669): getExtractedText при неактивном InputConnection
    W / IInputConnectionWrapper (21669): getExtractedText при неактивном InputConnection
    .....
    <..... одно и то же сообщение столько раз .....>
    .....
    W / IInputConnectionWrapper (21669): getExtractedText при неактивном InputConnection
    W / IInputConnectionWrapper (21669): getExtractedText при неактивном InputConnection
    W / IInputConnectionWrapper (21669): getExtractedText при неактивном InputConnection

См. Журнал консоли выше.
Спасибо.

<Тест чистого проекта>

Это результат тестирования моего приложения Real World. Я хотел увидеть, есть ли какие-либо различия в исходном приложении флаттера, которое я создал, поэтому я создал новый проект и снова протестировал его, но результат такой же, как и в реальном приложении. Он был воспроизведен как есть.

  • В этом случае воспроизведите проблему с дублированием ввода: ввод слова -> скрыть клавиатуру и показать клавиатуру -> ввести другое слово -> не ждать, пока фокус клавиатуры исчезнет естественным образом, а нажмите кнопку пробела (на программной клавиатуре устройства) сразу после слова освободить фокус.
    (это важный тестовый совет)

  • Вышеупомянутый тест был запущен на чистом проекте, созданном, как показано ниже.

дети:[
Текст(
'Вы нажимали кнопку столько раз:',
),
Текст(
'$ _counter',
стиль: Theme.of (контекст) .textTheme.display1,
),
Текстовое поле(
maxLengthEnforced: true,
maxLength: 500,
украшение: InputDecoration (
labelStyle: TextStyle (fontSize: 15),
labelText: 'xxxxxx',
hintStyle: TextStyle (
fontSize: 13, цвет: Colors.grey [400]),
hintText: 'xxxxxx',
),
keyboardType: TextInputType.multiline,
maxLines: нуль,
onChanged: (val) {},
)
],


  • Журнал консоли (клавиатура вверх и вниз)
    W / IInputConnectionWrapper (14019): getExtractedText при неактивном InputConnection
    W / IInputConnectionWrapper (14019): getExtractedText при неактивном InputConnection
    ......
    ..... так много раз
    .....
    W / IInputConnectionWrapper (14019): getExtractedText при неактивном InputConnection
    W / IInputConnectionWrapper (14019): getExtractedText при неактивном InputConnection
    D / ViewRootImpl @ 82a4301 MainActivity : MSG_RESIZED: frame = Rect (0, 0 - 1080, 2220) ci = Rect (0, 72 - 0, 1071) vi = Rect (0, 72 - 0, 1071) или = 1
    D / ViewRootImpl @ 82a4301 MainActivity : Relayout возвращено: old = [0,0] [1080,2220] new = [0,0] [1080,2220] result = 0x1 surface = {valid = true 488086081536} changed = false
    D / ViewRootImpl @ 82a4301 MainActivity : указатель ViewPostIme 0
    D / ViewRootImpl @ 82a4301 MainActivity : указатель ViewPostIme 1
    D / InputMethodManager (14019): HSIFW - флаг: 0 Pid: 14019
    D / ViewRootImpl @ 82a4301 MainActivity : MSG_RESIZED: frame = Rect (0, 0 - 1080, 2220) ci = Rect (0, 72 - 0, 144) vi = Rect (0, 72 - 0, 144) или = 1
    D / ViewRootImpl @ 82a4301 MainActivity : Relayout возвращено: old = [0,0] [1080,2220] new = [0,0] [1080,2220] result = 0x1 surface = {valid = true 488086081536} changed = false

* Краткое изложение проблемы приведено ниже.
Проблемы, возникающие при применении модифицированной версии мастер-канала:

  1. Временная задержка клавиатуры вверх и вниз
  2. ненормальное отображение клавиатуры даже после закрытия приложения (на главном экране устройства)
  3. ввод дублирования слов
  4. строка ввода не может быть изменена во время ввода с клавиатуры

Надеюсь, это поможет вам решить различные проблемы.

@GaryQian На случай, если это поможет: версия устройства Samsung Experience Service, с которым мы тестировали, - 10.6.00.13 .

Остальная информация, которую вы запросили, уже была включена в опубликованный мной доктор трепетания, но вот она снова:

устройство: Galaxy Tab A (2019, 10.1)
модель: SM-T510
Версия Android: Android 9 (API 28)

Та же проблема здесь на главном устройстве и устройстве Galaxy Tab A (SM-T510).

flutter doctor -v
[✓] Flutter (Channel master, v1.15.4-pre.140, on Linux, locale fr_FR.UTF-8)
    • Flutter version 1.15.4-pre.140 at /home/bruno/flutter/flutter
    • Framework revision 1d4667bb38 (il y a 5 heures), 2020-02-24 08:56:02 +0530
    • Engine revision f2f8c342be
    • Dart version 2.8.0 (build 2.8.0-dev.9.0 0f141be8bd)

[!] Android toolchain - develop for Android devices (Android SDK version 28.0.3)
    • Android SDK at /home/bruno/Android/Sdk
    • Android NDK location not configured (optional; useful for native profiling support)
    • Platform android-28, build-tools 28.0.3
    • Java binary at: /home/bruno/flutter/android-studio/jre/bin/java
    • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1248-b01)
    ✗ Android license status unknown.
      Try re-installing or updating your Android SDK Manager.
      See https://developer.android.com/studio/#downloads or visit https://flutter.dev/setup/#android-setup for detailed
      instructions.

[✓] Linux toolchain - develop for Linux desktop
    • clang++ 7.0.0
    • GNU Make 4.2.1

[✓] Android Studio (version 3.3)
    • Android Studio at /home/bruno/flutter/android-studio
    • Flutter plugin version 34.0.1
    • Dart plugin version 182.5215
    • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1248-b01)

[✓] VS Code (version 1.42.1)
    • VS Code at /usr/share/code
    • Flutter extension version 3.8.1

[✓] Connected device (2 available)
    • SM T510 • R52M40T1T7H • android-arm • Android 9 (API 28)
    • Linux   • Linux       • linux-x64   • Linux

Для людей, которые ищут быстрое решение: замените приложение Samsung Keyboard другим приложением Android Keyboard ;-)

@Endebert @bleroux Поскольку у нас еще есть два сообщения об ошибке на SM-T510, я заказал один, который прибудет в среду.

Можно подтвердить, что все версии этой ошибки по-прежнему возникают на SM-T510 (Galaxy Tab A 2019 10.1 ")

Обновление: интересно, что устройства, которые все еще воспроизводят какой-то вариант этой ошибки, делают что-то странное по-разному.

Например, на SM-T510 клавиатура отправляет вызов finishComposingText сразу после первого символа, введенного в поле. Это вызывает первоначальное дублирование персонажей. Ни одна из других клавиатур samsung (или клавиатур других производителей) этого не делает. Клавиатура SMT510 также, кажется, полностью игнорирует вызовы updateSelection и updateCursorAnchorInfo , как если бы эти методы просто не были реализованы в этой версии. Кажется, он полностью зависит от внутреннего отслеживания этой информации. Я могу отправлять любые бредовые данные через эти вызовы без какого-либо влияния на результаты. Это делает мои обходные пути бесполезными на этом устройстве.

Дублирование также несовместимо с J6 +.

@GaryQian Вау, это кажется сложной проблемой! Я всегда представлял, что кто-то из Google, участвующий в таком известном проекте, как Flutter, сможет напрямую связаться с командами Android и Samsung, чтобы получить помощь в чем-то вроде этого. Не тот случай?

Это вообще разрешено? Невыполненные основные функции ?? Я не могу думать, что это влияет только на трепетание, верно ??
и может кто-нибудь объяснить, как работает собственное текстовое поле Android?

Почему флаттер вообще использует родную клавиатуру ?! 😏

@ tedhenry100 Мы связывались с Samsung, однако это одна из тех вещей, где, даже если они исправят это на своей стороне, нам все равно придется исправить это здесь, поскольку маловероятно, что все клавиатуры в дикой природе можно обновить.

С момента первоначальной регистрации этой проблемы состояние ошибки изменилось. Серьезность была значительно снижена для большинства устройств, и были обнаружены новые модели поведения, которые привели к изменению набора проблем. Поскольку в этой ветке из сотен комментариев может быть сложно (и с задержками) следить, я перейду дальнейшее обсуждение к новому выпуску https://github.com/flutter/flutter/issues/51893, где мы сможем сосредоточиться на текущее состояние вопроса.

Продолжайте публиковать / сообщать / комментировать https://github.com/flutter/flutter/issues/51893 и при необходимости ссылаться на комментарии в этой ветке. Спасибо!

Из новой темы:

Я установил flutter / engine # 17426, который, кажется, исправляет многие ошибки на моих тестовых устройствах. Было бы здорово, если бы другие могли подтвердить, что это также исправляет ошибки для них.

Пожалуйста, попробуйте изменить основной канал!

@GaryQian Я тестировал эту проблему с клавиатурой и обнаружил повторяющуюся проблему в последней бета-версии, к которой применяется https://github.com/flutter/engine/pull/17391 .
По какой-то причине буква «@» вызывает это дублирование и на английском языке.

Пожалуйста, проведите тестирование на главном канале, я считаю, что ошибка уже устранена в другом продолжающемся потоке с помощью исправления getExtractedText ().

Бета-каналу часто больше месяца, и многие ошибки, связанные с флаттером, исправляются / обновляются ежедневно.

В частности, исправление getExtractedText () появилось только на этой неделе.

@GaryQian Я использую последнюю бета-версию 1.17.dev.3.1. Есть ли какие-либо другие обновления по этому поводу, кроме flutter / engine # 17391? Я дам вам знать о последней мастер-фиксации.

flutter / engine # 17426 должен устранить дублирование.

@GaryQian Я думал, что # 17391 был последним коммитом, и вы правы, эта проблема не появляется с последним мастером. Извините за путаницу. Я очень ценю вашу помощь и большое спасибо за вашу тяжелую работу, чтобы исправить это.

Этот поток был автоматически заблокирован, поскольку после его закрытия в последнее время не было никаких действий. Если вы все еще сталкиваетесь с подобной проблемой, откройте новую ошибку, включая вывод flutter doctor -v и минимальное воспроизведение проблемы.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги