Эффект пишущей машинки выглядит просто: символы появляются один за другим. Но за «пропуском анимации», «отсутствием усечения» и «отсутствием снижения производительности» скрывается целый набор инженерных решений. Реализация в этой статье — это Flutter/Dart ba...
Эффект пишущей машинки выглядит просто: символы появляются один за другим. Но за «пропуском анимации», «отсутствием усечения» и «отсутствием снижения производительности» скрывается целый набор инженерных решений.
Реализация в этой статье основана на Flutter/Dart, но основные семантические решения — «пропустить ≠ прерывание» и «буферизация и пакетная обработка» — не зависят от платформы: Web EventSource и собственные/RN SSE-клиенты сталкиваются с одним и тем же выбором.
Пролог: кнопка «пропустить пишущую машинку», которая постоянно ломалась
В повествовательном приложении ИИ (где пользователь влияет на интерактивную историю, управляемую ИИ, вводя инструкции судьбы) я создал кнопку «⏩ пропустить пишущую машинку» — пользователи нажимают на нее, чтобы сразу увидеть полный ответ ИИ, вместо того, чтобы ждать, пока текст появится посимвольно.
В журнале разработки кнопка прошла три стадии:
V1: нажатие ничего не дает — обратный вызов срабатывает, но пользователь не испытывает никаких изменений
V2: нажатие обрезает контент — анимация пропала, но ответ тоже неполный
Финал: при нажатии сразу отображается часть текста, в то время как LLM продолжает генерировать полный ответ в фоновом режиме, который появляется сразу после завершения.
За этими тремя версиями скрываются три наиболее распространенные ошибки в "str.