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

xlo*_*log 2 android mvvm viewmodel kotlin android-jetpack-compose

该函数将如何@Composable ContentFeed()访问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
}
Run Code Online (Sandbox Code Playgroud)

Phi*_*hov 5

在任何可组合项中,您可以使用viewModel<YourClassHere>()

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

目前,Compose 中唯一的例外是当您使用 Compose 导航时,它未绑定到活动/片段。在这种情况下,商店所有者绑定到每个路线,请参阅答案,了解如何在路线之间共享商店所有者。

查看文档中有关视图模型 Compose 的更多信息。

  • @xlog正确,您不需要初始化活动中的任何内容。视图模型将在您需要时创建 (2认同)