我有一个关于StateFlow
和用户界面重组的问题.简而言之,我的ViewModel有三个流程:
accountFlow
,用于从数据库中获取当前登录的账号.
timelinePositionFlow
,用于从当前登录的账号中检索最后一条浏览位置记录.
timelineFlow
,它包含数据库中存储的当前登录帐户的所有帖子.
我面临的问题是,我的应用程序可以在多个账户之间切换,并浏览信息.因 for each 帐户都有一个存储的时间线位置,所以我需要使用rememberLazyListState(initialFirstVisibleItemIndex = ...)
来初始化LazyColumn的位置.但是,如果我切换帐户,并且StateFlow发出新帐户的值,则rememberLazyListState
不会重新组合.因此新账户的时间线大小可能只有20,而旧账户的时间线位置索引大于20,这将导致java.lang.IndexOutOfBoundsException
错误
有没有解决这个问题的好办法?
视图模型
private val activeAccountFlow = accountDao
.getActiveAccountFlow()
.filterNotNull()
.distinctUntilChanged { old, new -> old.id == new.id }
val timelinePosition = activeAccountFlow
.mapLatest { TimelinePosition(it.firstVisibleItemIndex, it.offset) }
.stateIn(
scope = 视图模型Scope,
started = SharingStarted.WhileSubscribed(),
initialValue = TimelinePosition()
)
val timeline = activeAccountFlow
.flatMapLatest { timelineDao.getStatusListWithFlow(it.id) }
.map { splitReorderStatus(it).toUiData().toImmutableList() }
.stateIn(
scope = 视图模型Scope,
started = SharingStarted.WhileSubscribed(),
initialValue = persistentListOf()
)
用户界面
val timeline by 视图模型.timeline.collectAsStateWithLifecycle()
val timelinePosition by 视图模型.timelinePosition.collectAsStateWithLifecycle()
val lazyState = rememberLazyListState(
initialFirstVisibleItemIndex = timelinePosition.index,
initialFirstVisibleItemScrollOffset = timelinePosition.offset
)
LazyColumn { ... }