Сбор потока не производит никаких обновленийAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Сбор потока не производит никаких обновлений

Сообщение Anonymous »

В примере проекта у меня есть модель представления с двумя вариантами использования. Оба варианта использования вызывают один и тот же репозиторий. Через поток извлекается список задач, который хранит репозиторий в StateFlow. Другой предоставляет метод добавления дополнительных задач в этот StateFlow.
Проблема в том, что когда я пытаюсь добавить новую задачу, поток не выдает новых изменений.
Это мои занятия:

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

class TaskRepositoryImpl @Inject constructor() : TaskRepository {

private val initialTaskBusiness = mutableListOf(
TaskBusiness(id = 1, text = "Task1"),
TaskBusiness(id = 2, text = "Task2"),
TaskBusiness(id = 3, text = "Task3")
)

private val _tasksFlow = MutableStateFlow(initialTaskBusiness.toList())
private val tasksFlow: StateFlow = _tasksFlow

override suspend fun getTask(): StateFlow = tasksFlow

override suspend fun addTask(task: TaskBusiness) {
_tasksFlow.update { _tasksFlow.value + task }
Log.d("DEBUGME ", "Added task")
}

override suspend fun deleteTask(task: TaskBusiness) {
_tasksFlow.update { _tasksFlow.value.filter { it.id != TaskDB(task).id } }
}

}

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

class GetTasksUseCase @Inject constructor(private val repository: TaskRepository,) {

suspend operator fun invoke(): Flow = repository.getTask()

}

class AddTaskUseCase @Inject constructor(private val repository: TaskRepository,) {

suspend operator fun invoke(taskBusiness: TaskBusiness) {     repository.addTask(taskBusiness) }

}

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

@HiltViewModel
class TaskViewModel @Inject constructor(
private val getTasksUseCase: GetTasksUseCase,
private val addTaskUseCase: AddTaskUseCase,
) : ViewModel() {

private val _tasks: MutableStateFlow = MutableStateFlow(emptyList())
val tasks get() = _tasks.asStateFlow()

init {
fetchTasks()
}

private fun fetchTasks() {
viewModelScope.launch {
getTasksUseCase().map { taskListBusiness ->
taskListBusiness.map { TaskViewEntry(it) }
}.collect { taskList ->
Log.d("DEBUGME ", "Fetched tasks: $taskList")
_tasks.value = taskList
}
}
}

fun onTaskAdded(text: String) {
viewModelScope.launch {
addTaskUseCase(
TaskBusiness(
text = text
)
)
}
}

}
Даже если модель представления собирает этот поток, она не производит никаких выбросов. Даже если я отлаживаю, он никогда не создает новое обновление в viewModel, даже если данные StateFlow изменяются. Кроме того, если я отлаживаю TaskFlow, я получаю 0 nCollectors. Я пытался принудительно ввести новое значение при добавлении списка в пустой список или убедиться, что новый список является новым значением, чтобы вызвать реактивность. Я пытался реализовать потоки разными способами, но ни разу не смог добиться реактивности. Что я делаю неправильно? Следующим шагом является создание localDataSource, который заменяет хранилище в памяти комнатным DAO, но изначально хочет работать по памяти.

Подробнее здесь: https://stackoverflow.com/questions/790 ... any-update
Ответить

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

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

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

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

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