Ok, ho riesaminato la questione oggi e sono riuscito a riprodurre il problema dopo aver cambiato la tastiera virtuale sul mio telefono in Gboard. Gboard a volte genera eventi keydown e keyup due volte per una singola pressione del tasto e se ciò accade per l’ultimo tasto premuto prima di selezionare un emoji dall’autocompletamento, si verificherà un crash.
Non sono sicuro di cosa causi a Gboard la generazione di questi eventi due volte, ma sembra dipendere da ciò che hai digitato e dalle tue impostazioni di Gboard.
I doppi eventi causano un crash a causa del modo in cui è progettata la nostra libreria di autocompletamento. Quindi la libreria ascolta sia gli eventi keydown che keyup, e su keydown cancella i suggerimenti di autocompletamento e su keyup offre nuovi suggerimenti basati sul nuovo termine di autocompletamento.
Tuttavia, c’è una piccola protezione/ottimizzazione per evitare che la libreria esegua lavoro duplicato quando il termine non è cambiato rispetto ai suggerimenti precedenti, ed è qui che si verifica il problema. La prima coppia di eventi keydown e keyup cancella i vecchi suggerimenti e ne offre di nuovi come previsto, ma la seconda coppia errata cancellerà nuovamente i suggerimenti su keydown ma non ne offrirà di nuovi su keyup perché il termine di autocompletamento non è cambiato.
L’unica “correzione” meno “hacky” a cui riesco a pensare è rimuovere la protezione/ottimizzazione in modo che la libreria offra sempre nuovi suggerimenti su keyup, ma non sono sicuro se questo sia desiderato o ne valga la pena.
So che vogliamo riscrivere la nostra libreria di autocompletamento a un certo punto (è uno dei codici più vecchi nel codebase e ha disperatamente bisogno di una riscrittura), quindi forse questo bug potrebbe aspettare finché non arriveremo alla riscrittura?