Проблема с состоянием в реактивном ранцеCompose и Flow

У меня сейчас проблема с JetpackCompose. Проблема в том, что когда я собираю данные из потока, значение извлекается из firebase, как будто есть слушатель, и данные меняются каждый раз. Но это не то.

Я не знаю, в чем настоящая проблема!

FirebaseSrcNav

      suspend fun getName(uid: String): Flow<Resource.Success<Any?>> = flow {
    val query = userCollection.document(uid)
    val snapshot = query.get().await().get("username")
    emit(Resource.success(snapshot))
}

NavRepository

      suspend fun getName(uid: String) = firebase.getName(uid)

ГлавнаяПросмотрМодель

      fun getName(uid: String): MutableStateFlow<Any?> {
    val name = MutableStateFlow<Any?>(null)
    viewModelScope.launch {
        navRepository.getName(uid).collect { nameState ->
            when (nameState) {
                is Resource.Success -> {
                    name.value = nameState.data
                    //_posts.value = state.data
                    loading.value = false
                }
                is Resource.Failure<*> -> {
                    Log.e(nameState.throwable, nameState.throwable)
                }
            }
        }
    }
    return name
}

Я думаю, что проблема в HomeScreen, когда я вызываю значение collectasState ().

Домашний экран

      val state = rememberLazyListState()
        LazyColumn(
            state = state,
            verticalArrangement = Arrangement.spacedBy(10.dp)
        ) {
            items(post) { post ->
                //val difference = homeViewModel.getDateTime(homeViewModel.getTimestamp())
                val date = homeViewModel.getDateTime(post.timeStamp!!)
                val name = homeViewModel.getName(post.postAuthor_id.toString()).collectAsState().value
                QuestionCard(
                    name = name.toString(),
                    date = date!!,
                    image = "",
                    text = post.postText!!,
                    like = 0,
                    response = 0,
                    topic = post.topic!!
                )
            }
        }

Я не могу опубликовать видео, но если вам нужно изображение, представьте себе текстовое поле, в котором тест чередуется между «null» и «MyName» каждые 0,005 секунды.

1 ответ

Проверьте официальную документацию.

https://developer.android.com/kotlin/flow

Поток асинхронный

На просмотреМодель

      private val _name = MutableStateFlow<String>("")
    val name: StateFlow<String>
        get() = _name

fun getName(uid: String) {
    viewModelScope.launch {
        //asyn call
        navRepository.getName(uid).collect { nameState ->
            when (nameState) {
                is Resource.Success -> {
                    name.value = nameState.data
                }
                is Resource.Failure<*> -> {
                    //manager error
                    Log.e(nameState.throwable, nameState.throwable)
                }
            }
        }
    }
}

на ваш взгляд

      override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    ...
    lifecycleScope.launch {
        viewModel.name.collect { name -> handlename
        }
    }
}
Другие вопросы по тегам