1. 作用域决定 ViewModel 的实例
若以 Activity 为作用域:
所有 Fragment 通过 ViewModelProvider(requireActivity()) 获取的 ViewModel 是同一个实例。
若以 Fragment 自身为作用域:
每个 Fragment 通过 ViewModelProvider(this) 获取的 ViewModel 是不同的实例。
2. 生命周期与数据共享
以 Activity 为作用域:
ViewModel 的生命周期与 Activity 绑定,当 Activity 销毁时才会清除。
适合多个 Fragment 之间需要共享数据的场景(如购物车状态、用户信息)。
以 Fragment 自身为作用域:
ViewModel 的生命周期与 Fragment 绑定,当 Fragment 销毁时清除。
适合仅在单个 Fragment 内部使用的临时数据。
3. 核心原理
ViewModelStore:
每个 ViewModelStoreOwner(如 Activity 或 Fragment)内部维护一个 ViewModelStore,用于存储 ViewModel 实例。
当作用域是 Activity 时,所有 Fragment 共享 Activity 的 ViewModelStore。
当作用域是 Fragment 时,每个 Fragment 拥有独立的 ViewModelStore。