My ViewModel
Код: Выделить всё
@HiltViewModel
class WorkingDayViewModel @Inject constructor(
private val repository: WorkingDayRepository
) : ViewModel() {
companion object{
private const val MILLS = 5_000L
}
val allWorkingDaysState : StateFlow = repository.getAllWorkingDays()
.map { WorkingDayState(it) }
.onEach {
println("All Working Days: $it")
}
.stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(MILLS),
initialValue = WorkingDayState()
)
fun upsertWorkingDay(workingDay: WorkingDay) {
viewModelScope.launch {
repository.upsertWorkingDay(workingDay)
}
}
}
Код: Выделить всё
val workingDays by viewModelWorkingDays.allWorkingDaysState.collectAsState()
LaunchedEffect(key1 = workingDays) {
Log.d("workingDays", workingDays.toString())
}
Код: Выделить всё
@Entity(tableName = "WorkingDays")
data class WorkingDay(
@PrimaryKey(autoGenerate = false)
val date: LocalDate,
val startTime: LocalTime,
val endTime: LocalTime,
val pauseTime: Int,
val fixedHourDayDuration: Int,
val isFixedHourDay: Boolean,
var isActive: Boolean,
)
Код: Выделить всё
data class WorkingDayState(
val workingDays: List = emptyList(),
val date: LocalDate? = null,
val startTime: LocalTime? = null,
val endTime: LocalTime? = null,
val pauseTime: String = "",
val fixedHourDayDuration: Int = 0,
val isFixedHourDay: Boolean = false,
val isActive: Boolean = true,
)
Код: Выделить всё
@Dao
interface WorkingDaysDao {
@Upsert
fun upsertWorkingDay(workingDay: WorkingDay)
@Insert(onConflict = OnConflictStrategy.IGNORE)
fun initInsertWorkingDay(workingDay: WorkingDay)
@Delete
fun deleteWorkingDay(workingDay: WorkingDay)
@Query("SELECT * FROM workingdays WHERE date = :date")
fun getWorkingDayByDate(date: LocalDate): Flow
@Query("SELECT * FROM workingdays")
fun getAllWorkingDays(): Flow
}
Код: Выделить всё
class WorkingDayRepository @Inject constructor(
private val dao: WorkingDaysDao
) {
fun upsertWorkingDay(workingDay: WorkingDay) = dao.upsertWorkingDay(workingDay)
fun initInsertWorkingDay(workingDay: WorkingDay) = dao.initInsertWorkingDay(workingDay)
fun deleteWorkingDay(workingDay: WorkingDay) = dao.deleteWorkingDay(workingDay)
fun getWorkingDayByDate(date: LocalDate) = dao.getWorkingDayByDate(date)
fun getAllWorkingDays() = dao.getAllWorkingDays()
}
Код: Выделить всё
class LocalDateConverter {
@TypeConverter
fun fromTimestamp(value: Long?): LocalDate? {
return value?.let {
ofEpochMilli(it).atZone(ZoneId.systemDefault()).toLocalDate()
}
}
@TypeConverter
fun dateToTimestamp(date: LocalDate?): Long? {
return date?.atStartOfDay(ZoneId.systemDefault())?.toInstant()?.toEpochMilli()
}
}
class LocalTimeConverter {
@TypeConverter
fun fromLocalTime(value: LocalTime?): String? {
return value?.toString()
}
@TypeConverter
fun toLocalTime(value: String?): LocalTime? {
return value?.let { LocalTime.parse(it) }
}
}
https://github.com/SkAppCoding/DebugTests
Проблема теперь следующая:
Проект на Git:
https://github.com/SkAppCoding/DebugTests
Проблема теперь следующая:
p>
Когда я вызываю upsertWorkingDay и меняю некоторые значения. Значения сохраняются в БД. allWorkingDaysState также создает новое состояние. Распечатывается вход в систему .onEach.
Но вот тут-то и начинается проблема. Мой LaunchedEffect не срабатывает.
Другое дело. Когда я меняю значение в БД напрямую с помощью «Проверки приложений» в Android Studio, allWorkingDaysState также выдает новое значение. Печатается вход в систему .onEach.
Но также срабатывает мой LaunchedEffect.
В чем разница. Что я делаю неправильно? Надеюсь, вы мне поможете.
Я пробовал много сообщений журнала. Но ничто не помогло мне найти проблему.
Я ожидаю, что мой LaunchedEffect также сработает, если allWorkingDaysState выдаст новое значение после upsertWorkingDay.
Подробнее здесь: https://stackoverflow.com/questions/789 ... te-problem
Мобильная версия