Google Maps应用中fetchLocationUpdates参数未传值问题求助
解决「No value passed for parameter fetchLocationUpdates」错误
问题根源
你定义的rememberAppState()函数要求必须传入fetchLocationUpdates: () -> Unit参数,但在BetteHomesApp中调用rememberAppState()时未提供该参数,导致编译错误。同时fetchLocationUpdates是MainActivity中的私有函数,需要将其传递给Compose组件才能在App状态中复用。
修复步骤
- 给
BetteHomesAppcomposable添加参数,接收fetchLocationUpdates函数引用 - 调用
rememberAppState()时传入该参数 - 在MainActivity启动Compose时传递
::fetchLocationUpdates函数引用
修改后的代码示例
1. 更新BetteHomesApp.kt中的BetteHomesApp函数
@OptIn(ExperimentalMaterialApi::class) @Composable @ExperimentalMaterial3Api // 添加参数接收fetchLocationUpdates fun BetteHomesApp(fetchLocationUpdates: () -> Unit) { BetteHomesTheme { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { RequestNotificationPermissionDialog() } Surface(color = MaterialTheme.colors.background) { // 调用rememberAppState时传入参数 val appState = rememberAppState(fetchLocationUpdates = fetchLocationUpdates) Scaffold( snackbarHost = { SnackbarHost( hostState = it, modifier = Modifier.padding(8.dp), snackbar = { snackbarData -> Snackbar(snackbarData, contentColor = MaterialTheme.colors.onPrimary) } ) } ) { innerPaddingModifier -> NavHost( navController = appState.navController, startDestination = MAP_SCREEN, modifier = Modifier.padding(innerPaddingModifier) ) { betteHomesGraph(appState) } } } } }
2. MainActivity中传递函数引用
假设你的MainActivity通过setContent启动Compose,修改如下:
class MainActivity : AppCompatActivity() { // ... 你的其他代码(如fusedLocationClient、geoMarkerViewModel等) private fun fetchLocationUpdates(){ lifecycleScope.launch { lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) { fusedLocationClient.locationFlow().collect { it?.let{ location -> geoMarkerViewModel.setCurrentLatLng(LatLng(location.latitude, location.longitude)) } } } } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { // 传递fetchLocationUpdates函数引用 BetteHomesApp(fetchLocationUpdates = ::fetchLocationUpdates) } } }
3. 可选优化:给rememberAppState参数加默认值
如果希望fetchLocationUpdates成为可选参数,可以给它添加空默认实现(仅在允许该逻辑可选时推荐):
@Composable fun rememberAppState( navController: NavHostController = rememberNavController(), snackbarHostState: SnackbarHostState = remember { SnackbarHostState() }, snackbarManager: SnackbarManager = SnackbarManager, resources: Resources = resources(), coroutineScope: CoroutineScope = rememberCoroutineScope(), // 添加默认空实现 fetchLocationUpdates: () -> Unit = {} ) = remember(snackbarHostState, navController, snackbarManager, resources, coroutineScope, fetchLocationUpdates) { BetteHomesAppState(navController, snackbarHostState, snackbarManager, resources, coroutineScope, fetchLocationUpdates) }
完成上述修改后,编译错误会消失,MapsScreen也能通过appState.fetchLocationUpdates正确调用MainActivity中的位置更新逻辑。
内容的提问来源于stack exchange,提问作者Kaleab Woldemariam
相关产品推荐
相关产品推荐

