Невозможно получить новые данные в методе .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))
}
}
Код: Выделить всё
class FoodItemViewModel:ViewModel() {
private val repository = FoodItemRepository
val data: StateFlow[*]> = repository.datasFlow
...
Код: Выделить всё
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))
}
...
Код: Выделить всё
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() и попытайтесь понять его использование в этой статье.
Извлекать самые новые данные из репозитория в любое время (в том числе после обновления значения StateFlow в репозитории.
P.S.Я следую шаблону проектирования MVVM.
Расположение проекта
Проект расположен на Github.
Код: Выделить всё
https://github.com/junshin4211/HealthHelper/blob/2b9fd8d89bd7a9bb3ee5387d8ebfc9f2e578fbbb/app
Подробнее здесь: https://stackoverflow.com/questions/791 ... ate-method