Android Compose MVVM - 如何在不带参数的可组合函数中引用 viewModel 对象?

Posted

技术标签:

【中文标题】Android Compose MVVM - 如何在不带参数的可组合函数中引用 viewModel 对象?【英文标题】:Android Compose MVVM - How to reference a viewModel object in a Composable function that doesn't take arguments? 【发布时间】:2022-01-16 22:19:06 【问题描述】:

@Composable ContentFeed() 函数如何访问在 Activity 中创建的viewModel?依赖注入?或者这是一种错误的做事方式? viewModel 应该始终只有一个实例。

// MainActivity.kt
class MainActivity : ComponentActivity() 
    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        val viewModel by viewModels<MainViewModel>()
        setContent 
        PracticeTheme 
            // A surface container using the 'background' color from the theme
            Surface(color = MaterialTheme.colors.background) 
                PulseApp(viewModel)
            
        
    


// TabItem.kt
typealias ComposableFun = @Composable () -> Unit

sealed class TabItem(var icon: Int, var title: String, var content: ComposableFun) 
    object Feed : TabItem(R.drawable.ic_baseline_view_list_24, "Feed",  ContentFeed() )


// Content.kt
@Composable
fun ContentFeed() 
    // I need viewModel created in MainActivity.kt here

【问题讨论】:

【参考方案1】:

在任何可组合中,您都可以使用viewModel&lt;YourClassHere&gt;()

返回一个现有的ViewModel 或在给定的所有者(通常是片段或活动)中创建一个新的,默认为LocalViewModelStoreOwner 提供的所有者。

目前 Compose 中唯一的例外是,当它未绑定到活动/片段时,是您使用 Compose Navigation 时。在这种情况下,店主绑定到每条路由,请参阅 this 和 this 答案,了解如何在路由之间共享店主。

在documentation 中查看有关视图模型的更多信息。

【讨论】:

哦,哇,我不敢相信我错过了。到目前为止,我一直在做的是在活动的onCreate() 方法中初始化ViewModel,并将其作为参数传递给所有函数。所以我应该在所有需要特定viewModel 的可组合函数中改为val viewModel = viewModel&lt;MyViewModel&gt;() 对吗? @xlog 正确,您不需要在活动中初始化任何内容。视图模型将在您需要时创建

以上是关于Android Compose MVVM - 如何在不带参数的可组合函数中引用 viewModel 对象?的主要内容,如果未能解决你的问题,请参考以下文章

Jetpack Compose 架构比较:MVP & MVVM & MVI

Jetpack Compose 到底适合什么架构?

Jetpack Compose 中的架构思想

如何构建Android MVVM 应用框架

如何构建Android MVVM 应用框架

如何构建Android MVVM应用程序