Почему невозможно получить новейшие данные с помощью метода .collectAsState()?Android

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Почему невозможно получить новейшие данные с помощью метода .collectAsState()?

Сообщение Anonymous »

проблема
Невозможно получить новые данные в методе .collectAsState(), появилась в
кодеВ LoadFoodItemInfo.kt
Метод вызывается.
FoodItemRepository.setDatas(queriedFoodItemVOs)
Но после приведенного выше оператора
вывод
Log.e(TAG,"Блок LaunchedEffect(Unit) был вызван.foodItemVOs:${foodItemVOs}")
является

Код: Выделить всё

LaunchedEffect(Unit) block was called.foodItemVOs:[]
где
переменная foodItemVOs определяется следующим образом.
val foodItemVOs от foodItemViewModel.data.collectAsState()
Почему не удается получить новейшие данные с помощью метода CollectAsState в StateFlow?
Вот мой код.
В LoadFoodItemInfo.kt

Код: Выделить всё

package com.example.healthhelper.dietary.interaction.database

import android.content.Context

import android.util.Log

import android.widget.Toast

import androidx.compose.runtime.Composable

import androidx.compose.runtime.LaunchedEffect

import androidx.compose.runtime.collectAsState

import androidx.compose.runtime.getValue

import androidx.lifecycle.viewmodel.compose.viewModel

import com.example.healthhelper.R

import com.example.healthhelper.dietary.interaction.dataclass.UpdateSelectedFoodItemVOs

import com.example.healthhelper.dietary.repository.FoodItemRepository

import com.example.healthhelper.dietary.viewmodel.FoodItemViewModel

import com.example.healthhelper.dietary.viewmodel.FoodViewModel

@Composable

fun LoadFoodItemInfo(

context:Context,

foodItemViewModel: FoodItemViewModel = viewModel(),

foodViewModel: FoodViewModel = viewModel(),

){

val TAG = "tag\_LoadFoodItemInfo"

val selectedFoodItemVO by foodItemViewModel.selectedData.collectAsState()

val foodItemVOs by foodItemViewModel.data.collectAsState()

LaunchedEffect(Unit) {

Log.e(TAG,"-".repeat(50))

Log.e(TAG,"In LoadFoodItemInfo function, selectedFoodItemVO:${selectedFoodItemVO}")

val queriedFoodItemVOs = foodItemViewModel.selectFoodItemByDiaryIdAndMealCategoryId(selectedFoodItemVO)

Log.e(TAG,"In LoadFoodItemInfo function, queriedFoodItemVOs:${queriedFoodItemVOs}")

if(queriedFoodItemVOs.isEmpty()){

Toast.makeText(context,context.getString(R.string.load\_food\_item\_info\_failed), Toast.LENGTH\_LONG).show()

return@LaunchedEffect

}

// set all elem of the array into repo -- FoodItemRepository.

FoodItemRepository.setDatas(queriedFoodItemVOs)

Toast.makeText(context,context.getString(R.string.load\_food\_item\_info\_successfully),

Toast.LENGTH\_LONG).show()

Log.e(TAG,"LaunchedEffect(Unit) block was called.foodItemVOs:${foodItemVOs}")

UpdateSelectedFoodItemVOs(

context = context,

foodItemVOs = foodItemVOs,

foodViewModel = foodViewModel,

)

Log.e(TAG,"-".repeat(50))

}

}

В FoodItemViewModel.kt

Код: Выделить всё

class FoodItemViewModel:ViewModel() {

private val repository = FoodItemRepository

val data: StateFlow[*]> = repository.datasFlow

...

В FoodItemRepository.kt

Код: Выделить всё

object FoodItemRepository {

val TAG = "tag\_MealsOptionRepository"

private val \_datasFlow: MutableStateFlow  = MutableStateFlow(mutableListOf())

val datasFlow: StateFlow

get() = \_datasFlow.asStateFlow()

...

fun setDatas(newDatas:List){

Log.e(TAG,"~".repeat(50))

Log.e(TAG,"In setDatas method,newDatas:${newDatas}")

\_datasFlow.value = newDatas.toMutableList()

Log.e(TAG,"In setDatas method,\_datasFlow.value:${\_datasFlow.value}")

Log.e(TAG,"~".repeat(50))

}

...

Вот последняя часть содержимого Logcat, когда я запускал программу.

Код: Выделить всё

2024-11-10 21:52:43.992 26480-26480 tag\_sendHttpRequest com.example.healthhelper E sendHttpRequest function was finished called.

2024-11-10 21:52:43.992 26480-26480 tag\_sendHttpRequest com.example.healthhelper E --------------------------------------------------

2024-11-10 21:52:43.993 26480-26480 tag\_LoadFoodItemInfo com.example.healthhelper E In LoadFoodItemInfo function, queriedFoodItemVOs:\[FoodItemVO(diaryID=8, foodID=1001, mealCategoryID=3, grams=100.0)\]

2024-11-10 21:52:43.993 26480-26480 tag\_MealsO...Repository com.example.healthhelper E ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

2024-11-10 21:52:43.995 26480-26480 tag\_MealsO...Repository com.example.healthhelper E In setDatas method,newDatas:\[FoodItemVO(diaryID=8, foodID=1001, mealCategoryID=3, grams=100.0)\]

2024-11-10 21:52:43.995 26480-26480 tag\_MealsO...Repository com.example.healthhelper E In setDatas method,\_datasFlow.value:\[FoodItemVO(diaryID=8, foodID=1001, mealCategoryID=3, grams=100.0)\]

2024-11-10 21:52:43.995 26480-26480 tag\_MealsO...Repository com.example.healthhelper E ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

2024-11-10 21:52:43.998 26480-26480 tag\_LoadFoodItemInfo com.example.healthhelper E LaunchedEffect(Unit) block was called.foodItemVOs:\[\]

2024-11-10 21:52:43.999 26480-26480 tag\_Update...oodItemVOs com.example.healthhelper E In UpdateSelectedFoodItemVOs function, foodItemVOs:\[\]

2024-11-10 21:52:44.000 26480-26480 tag\_Update...oodItemVOs com.example.healthhelper E In UpdateSelectedFoodItemVOs function, foodNames:\[\]

2024-11-10 21:52:44.000 26480-26480 tag\_Update...oodItemVOs com.example.healthhelper E In UpdateSelectedFoodItemVOs function, selectedFoodItemVOs:\[\]
Признательность
Будем очень признательны за любые ответы или советы по этой проблеме.
Что я пробовал ?
  • Найдите подробную информацию о проблеме с помощью вывода в Logcat.
  • прочитайте Jetpack Compose CollectAsState() не работает с Flow join() и попытайтесь понять его использование в этой статье.
Чего я ожидал?< /h1>
Извлекать самые новые данные из репозитория в любое время (в том числе после обновления значения StateFlow в репозитории.
P.S.Я следую шаблону проектирования MVVM.
Расположение проекта
Проект расположен на Github.

Код: Выделить всё

https://github.com/junshin4211/HealthHelper/blob/2b9fd8d89bd7a9bb3ee5387d8ebfc9f2e578fbbb/app
Но обратите внимание, что версия этой версии контролируется Git, поэтому другие люди, не входящие в эту группу, могут не иметь разрешения на доступ к ней.

Подробнее здесь: https://stackoverflow.com/questions/791 ... ate-method
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Почему невозможно получить новейшие данные с помощью метода .collectAsState()?
    Anonymous » » в форуме Android
    0 Ответы
    25 Просмотры
    Последнее сообщение Anonymous
  • (Flutter) HTTP-запрос не отвечает на новейшие устройства Android
    Anonymous » » в форуме Android
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • (Flutter) HTTP-запрос не отвечает на новейшие устройства Android
    Anonymous » » в форуме Android
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous
  • (Flutter) HTTP-запрос не отвечает на новейшие устройства Android
    Anonymous » » в форуме Android
    0 Ответы
    21 Просмотры
    Последнее сообщение Anonymous
  • Лучший способ использовать CollectAsState в приложении KMM с архитектурой ViewModel
    Anonymous » » в форуме Android
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Android»