屏幕未反映视图模型的更改

问题描述 投票:0回答:1

我有一个带有视图模型的屏幕。该屏幕有一个可组合项,其工作是基于视图模型渲染 UI 内容。单击可组合项时,它会导航到过滤器屏幕,用户可以在其中更新在视图模型中更新的过滤器。看截图

当我向后导航时,父屏幕仍然保留导航到屏幕截图中的过滤器设置之前的旧数据。

父可组合项包含一个过滤卡可组合项,其数据由视图模型驱动。单击后,它将导航到“过滤器”屏幕,如上图所示。

@Composable
fun ParentScreen(
    navController: NavController,
    modifier: Modifier = Modifier,
    vm: FilterViewModel = hiltViewModel(),
) {

        Filters(
            showCompleted = vm.filterState.showCompleted,
            showCustomerReturns = vm.filterState.showCustomerReturns,
            vendorName = vm.filterState.vendorName,
            loadGroup = vm.filterState.loadGroup,
            onClick = { navController.navigate(NavGraph.FILTER_SCREEN) }
        )
}

过滤器视图模型:

@HiltViewModel
class FilterViewModel @Inject constructor(
    private val Filter: Filter
) : ViewModel() {
    private val _filterState: MutableStateFlow<FilterState> by lazy {
      MutableStateFlow(
            FilterState(
                receivingFilter.loadGroup(),
                receivingFilter.showCompleted(),
                receivingFilter.showCustomerReturns(),
                receivingFilter.vendorName(),
            )
        )
    }
    var filterState = _filterState.asStateFlow()
}

data class FilterState(
    val loadGroup: String,
    val showCompleted: Boolean,
    val showCustomerReturns: Boolean,
    val vendorName: String,
)

通过

navController.popBackStack()
返回父屏幕。

我该如何解决这个问题?该应用程序使用 Jetpack compose 和 Hilt 进行依赖注入。

android android-jetpack dagger-hilt
1个回答
0
投票

您没有收集流量,因此您没有获得新值。

在您的 ParentScreen Composable 中收集您的 filterFlow 作为状态并使用它来传递值。

@Composable
fun ParentScreen(
    navController: NavController,
    modifier: Modifier = Modifier,
    vm: FilterViewModel = hiltViewModel(),
) {

    val filterState by vm.filterState.collectAsState()

    Filters(
        showCompleted = filterState.showCompleted,
        showCustomerReturns = filterState.showCustomerReturns,
        vendorName = filterState.vendorName,
        loadGroup = filterState.loadGroup,
        onClick = { navController.navigate(NavGraph.FILTER_SCREEN) }
    )
}
© www.soinside.com 2019 - 2024. All rights reserved.