You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Maps应用中fetchLocationUpdates参数未传值问题求助

解决「No value passed for parameter fetchLocationUpdates」错误

问题根源

你定义的rememberAppState()函数要求必须传入fetchLocationUpdates: () -> Unit参数,但在BetteHomesApp中调用rememberAppState()时未提供该参数,导致编译错误。同时fetchLocationUpdates是MainActivity中的私有函数,需要将其传递给Compose组件才能在App状态中复用。

修复步骤

  1. 给BetteHomesApp composable添加参数,接收fetchLocationUpdates函数引用
  2. 调用rememberAppState()时传入该参数
  3. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 16:45:55