diff --git a/app/src/main/java/com/itsaky/androidide/fragments/output/LogViewFragment.kt b/app/src/main/java/com/itsaky/androidide/fragments/output/LogViewFragment.kt index 3b16b6d8f0..3e19340c09 100644 --- a/app/src/main/java/com/itsaky/androidide/fragments/output/LogViewFragment.kt +++ b/app/src/main/java/com/itsaky/androidide/fragments/output/LogViewFragment.kt @@ -112,6 +112,13 @@ abstract class LogViewFragment : } private suspend fun observeLogs(): Nothing { + // Wait for the editor's first layout pass. The sora-editor's + // LineBreakLayout populates its line-width tracker asynchronously after + // layout; appending before that races BlockIntList.set on an empty list. + _binding?.editor?.awaitLayout( + onForceVisible = { emptyStateViewModel.setEmpty(false) }, + ) + viewModel.uiEvents.collect { event -> when (event) { is LogViewModel.UiEvent.Append -> { @@ -161,9 +168,10 @@ abstract class LogViewFragment : return } - _binding?.editor?.append(chars)?.also { - emptyStateViewModel.setEmpty(false) - } + val editor = _binding?.editor ?: return + if (!editor.isReadyToAppend) return + editor.appendBatch(chars.toString()) + emptyStateViewModel.setEmpty(false) } @UiThread