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

纯Compose项目为何仍需依赖fragment-ktx?

为什么纯Compose开发中使用by viewModels()需要依赖fragment-ktx?

核心关联原因

  • by viewModels()这个ViewModel委托函数并非ComponentActivity或Compose核心库自带,它的定义就在androidx.fragment:fragment-ktx库中。即使你没直接使用Fragment,只要调用这个委托函数,就必须引入该库作为依赖。
  • 结合Hilt的@AndroidEntryPoint来看:Hilt会为你的ComponentActivity生成对应的ViewModel工厂,但by viewModels()委托的实现逻辑依赖Fragment库中的ViewModelProvider扩展方法——这个委托最初是为Fragment设计的,后来扩展支持Activity,但代码实现仍保留在fragment-ktx里。

无需依赖fragment-ktx的替代方案

方案1:手动用ViewModelProvider创建

直接跳过委托,手动通过ViewModelProvider获取实例:

@AndroidEntryPoint
class MainActivity : ComponentActivity() {
    private val userViewModel: UserViewModel by lazy {
        ViewModelProvider(this)[UserViewModel::class.java]
    }

    // 后续代码不变
}

方案2:使用Compose专属的viewModel()函数

在Composable函数内直接用androidx.lifecycle:lifecycle-viewmodel-compose库提供的viewModel()函数获取,无需依赖fragment-ktx:

@AndroidEntryPoint
class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            Content()
        }
    }
}

@Composable
fun Content() {
    val userViewModel: UserViewModel = viewModel()
    val lazyArticleItem = userViewModel.list().collectAsLazyPagingItems()

    // 后续代码不变
}

你遗漏的关键点

  1. 没注意by viewModels()的归属:它属于fragment-ktx库,而非Activity或Compose的核心API。
  2. 忽略了Compose生态中自带的ViewModel获取方式,没必要沿用Fragment体系的委托。

内容的提问来源于stack exchange,提问作者SageJustus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 00:05:48