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

Compose Multiplatform项目中如何使用Context?迁移遇LocalContext访问问题

在Compose Multiplatform中获取Android Context的方法

Compose Multiplatform是跨平台框架,LocalContext是Android平台独有的Compose API,直接在common模块中调用会找不到定义,你可以通过以下两种方式解决:

1. 用expect/actual实现跨平台上下文获取

这是CM中处理平台差异化代码的标准方式,能让common模块间接访问Android Context:

步骤1:在common模块定义expect接口

在common源码集下创建平台相关的工具类,定义期望的可组合函数:

@Composable
expect fun getPlatformContext(): Any?

步骤2:在Android模块实现actual逻辑

在Android源码集下实现对应的actual函数,直接返回LocalContext.current:

@Composable
actual fun getPlatformContext(): Any? {
    return LocalContext.current
}

(其他平台如iOS可以返回对应平台的上下文对象,比如UIApplication.shared.delegate?.window?.rootViewController?.view)

步骤3:在common可组合项中使用

在common模块的可组合代码里调用这个函数,拿到Context后强转成Android的Context类型(注意判空):

@Composable
fun CommonComposable() {
    val context = getPlatformContext() as? Context
    context?.let {
        // 在这里使用Android Context做操作,比如获取资源、启动Activity等
    }
}

2. 将依赖Context的可组合项放到Android模块

如果你的可组合项只需要在Android平台运行,不需要跨平台复用,直接把它移到Android模块的源码集中,这样就能直接使用LocalContext.current,和原来的Android Compose写法完全一致:

@Composable
fun AndroidOnlyComposable() {
    val context = LocalContext.current
    // 正常使用Context
}

注意事项

  • 不要在common模块直接导入Android的android.content.Context或LocalContext,否则iOS等其他平台编译会报错
  • 尽量把依赖Context的业务逻辑封装成平台无关的接口,通过expect/actual实现,避免在common代码中直接处理Android特有的API

内容的提问来源于stack exchange,提问作者Anmol Singh Sahi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 12:23:16