Jetpack Compose中,默认参数与内部创建ViewModel是否有差异?
在Jetpack Compose中,ViewModel作为默认参数创建与函数内创建的差异
这两种写法本质功能上没区别,但在灵活性和适用场景上有细微差别:
功能一致性:不管是把
viewModel()作为默认参数还是在函数内声明,最终都会获取/创建和当前Composable所属的ViewModelStoreOwner(一般是页面或导航栈条目)绑定的ViewModel实例,生命周期完全同步,不会出现多实例或生命周期不匹配的问题。灵活性区别:
- 场景1的写法给调用方留了口子——可以手动传入自定义的ViewModel实例,比如写单元测试时传入Mock对象,或者在某些特殊场景下替换ViewModel的实现,实用性更强。
- 场景2的写法把ViewModel的创建完全封在Composable内部,外部调用时没法干预,适合那些逻辑简单、不需要外部替换ViewModel的组件。
两种场景的代码示例:
场景1(默认参数创建):
@Composable fun Foo(fooViewModel = viewModel()) { }
场景2(函数内创建):
@Composable fun Foo() { val fooViewModel = viewModel() }
简单总结:如果你的Composable需要做单元测试,或者可能在不同场景下替换ViewModel实现,优先选场景1;如果是内部自用的简单组件,两种写法随便用都行。
内容的提问来源于stack exchange,提问作者J. Cool
相关产品推荐
相关产品推荐

