android Jetpack合成-在视图模型之间传递数据

hjzp0vay  于 2023-01-07  发布在  Android
关注(0)|答案(1)|浏览(145)

我有一个关于视图模型和在它们之间传递数据的问题。我正在尝试制作一个简单的天气应用程序,它有两个屏幕(当前天气和预报)。在第一个屏幕中(当前天气)我从视图模型调用API,得到一堆数据。问题是如何将这些数据传递给第二个视图模型。当我已经有了第一个视图模型中的数据时,从第二个视图模型再次调用api。不是好方法。最清楚的方法是什么?在第一个视图模型中将数据保存到房间或数据存储区?

vngu2lb8

vngu2lb81#

    • viewModel()返回现有的ViewModel或在给定范围内创建新的ViewModel**。只要该范围处于活动状态,ViewModel就会保留。例如,如果在活动中使用可组合对象,则**viewModel()**将返回同一示例,直到活动完成或流程终止。有关详细信息,请参阅this

因此,您可以在两个屏幕中使用相同的视图模型,这将是一个适合这种情况的解决方案。
编辑1:
请检查此代码。

class WeatherViewModel : ViewModel() {
    var data = MutableStateFlow<Result<Model>>(Model())
        private set

    fun fetchData() {
        viewModelScope.launch {
            // Make API Call and update data
        }
    } }

@Composable fun MyApp() {
    val visibleScreen by remember { mutableStateOf("weather") }

    val weatherViewModel: WeatherViewModel = viewModel()

    val data = weatherViewModel.data..asStateFlow().collectAsState()

    if (visibleScreen == "weather") {
        WeatherScreen(data) {
            weatherViewModel.fetchData()
        }
    } else {
        ForecastScreen(data) {
            weatherViewModel.fetchData()
        }
    } }

@Composable fun WeatherScreen(weatherData: Result<Model>, refreshData: () -> Unit) {

}

@Composable fun ForecastScreen(weatherData: Result<Model>, refreshData: () -> Unit) {

}

相关问题