Код: Выделить всё
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.onStart
object DataRepository {
fun getDataStream(): Flow {
return flow {
var count = 0
while (true) {
emit(count++)
delay(1000)
}
}
.onStart { println("LOG: Cold flow has started.") }
}
}
< /code>
problemviewmodel.kt
Эта ViewModel запускает Coroutine в Init, чтобы собрать поток и обновить Mutablestateflow.
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.launch
class ProblemViewModel : ViewModel() {
private val _uiState = MutableStateFlow("Loading...")
val uiState = _uiState.asStateFlow()
init {
viewModelScope.launch {
DataRepository.getDataStream().collect { data ->
// I might be doing other important work here, not just updating state
println("LOG: Important work being done with data: $data")
_uiState.value = "Item: $data"
}
}
}
}
< /code>
Composable Screen
UI просто собирает состояние и отображает его.
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.lifecycle.viewmodel.compose.viewModel
@Composable
fun MyScreen(viewModel: ProblemViewModel = viewModel()) {
val uiState by viewModel.uiState.collectAsState()
Text(text = uiState)
}
< /code>
Точная проблема:
Когда я запускаю это и поворачиваю экран, я вижу «журнал: начался холодный поток». В моем журнале снова. Это доказывает, что коллекция перезапускается. < /P>
Мой вопрос: почему это происходит? Но это не должно означать всю работу внутри ViewModelscope.launch бессмысленная и должна быть отменена. Как вы можете видеть в моем блоке Collect, я мог бы выполнять другую важную работу, такую как ведение журнала или выполнение бэкэнд -вызова API. SharingStarted.whilesBscred (5000), ...) Подробнее здесь: https://stackoverflow.com/questions/797 ... n-rotation
Мобильная версия