我有一个简单的视图模型类,其状态正在被函数修改
@HiltViewModel
class MapViewModel @Inject constructor() : ViewModel() {
fun addNewLocation(location: Location) {
val latLng = LatLng(location.latitude, location.longitude);
state.value.coords?.add(latLng)
state.value = state.value.copy(
lastKnownLocation = location
)
}
val state: MutableState<MapState> = mutableStateOf(
MapState(
lastKnownLocation = null,
coords = mutableListOf<LatLng>()
)
)
}
还有一个渲染地图的
@Composable
组件,我想绘制一条折线,使用coords
的MapState
字段构建。
我正在前台服务中获取当前位置更新,该服务是从可以访问
viewModel
的主要活动类启动的
class MainActivity : ComponentActivity() {
private val viewModel: MapViewModel by viewModels()
// ...
但我无法参考服务中的
viewModel
。
每当服务获得新位置时,我如何更新
viewModel
的状态?
您可以使用 LiveData 例如在单独的文件中定义一个 LiveData 对象
object LocationLiveData : LiveData<Location>()
然后在你的服务中,每当你有一个新的位置更新 LocationLiveData 的值
LocationLiveData.value = location
并在您的视图模型中观察 LocationLiveData 并更新视图模型的状态
LocationLiveData.observeForever { location ->
addNewLocation(location)
}