Android中创建ViewModel的几种方法

部署运行你感兴趣的模型镜像

在Android中,ViewModel 是一种用于管理与UI相关的数据的架构组件。它的生命周期与 ActivityFragment 的生命周期相独立,能够有效地处理配置更改(如旋转屏幕)而不会丢失数据。以下是创建 ViewModel 的几种常见方式。

1. 使用 ViewModelProvider

这是最常用的方式,适用于 ActivityFragment

1.1 在 Activity 中创建 ViewModel

定义一个自己的 ViewModel 类:MyViewModel

class MyViewModel: ViewModel() { }

在 Activity 中创建 MyViewModel 的对象,关键代码:ViewModelProvider(this).get(MyViewModel::class.java)

class MyActivity : AppCompatActivity() {
    private lateinit var viewModel: MyViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
    }
}

1.2 在 Fragment 中创建 ViewModel

在 Fragment 中创建 MyViewModel 的对象,也是使用 ViewModelProvider。 关键代码:ViewModelProvider(requireActivity()).get(MyViewModel::class.java)

class MyFragment : Fragment() {
    private lateinit var viewModel: MyViewModel

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        viewModel = ViewModelProvider(requireActivity()).get(MyViewModel::class.java)
        return inflater.inflate(R.layout.fragment_my, container, false)
    }
}

2. 使用 ViewModelFactory

如果需要传递参数给 ViewModel,可以使用 ViewModelFactory

2.1 创建 ViewModelViewModelFactory

ViewModelFactory 用来自定义创建 ViewModel 的过程,可以用于往ViewModel的构造方法中传递参数

class MyViewModel(private val someParam: String) : ViewModel() {
    // ViewModel 的逻辑
}

class MyViewModelFactory(private val someParam: String) : ViewModelProvider.Factory {
    override fun <T : ViewModel?> create(modelClass: Class<T>): T {
        if (modelClass.isAssignableFrom(MyViewModel::class.java)) {
            return MyViewModel(someParam) as T
        }
        throw IllegalArgumentException("Unknown ViewModel class")
    }
}

2.2 在 ActivityFragment 中使用 ViewModelFactory

还是使用了 ViewModelProvider,只不过多传递了 ViewModelFactory 参数。关键代码是:ViewModelProvider(this, factory).get(MyViewModel::class.java)

class MyActivity : AppCompatActivity() {
    private lateinit var viewModel: MyViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val factory = MyViewModelFactory("Some parameter")
        viewModel = ViewModelProvider(this, factory).get(MyViewModel::class.java)
    }
}

3. 使用 by viewModels() 委托

Android官方基于 kotlin 语言特性,提供了一些方便的扩展库,可以用来简化 ViewModel 的创建过程。比如 by viewModels()

3.1 添加扩展库依赖

在 build.gradle(module级别) 中添加扩展依赖:⬇️

dependencies {
   implementation("androidx.activity:activity-ktx:1.9.3")
   implementation("androidx.fragment:fragment-ktx:1.8.5")
 }

3.2 在Fragment 中使用 by viewModels()

Fragment 中,可以使用 by viewModels() 委托来简化 ViewModel 的获取。

class MyFragment : Fragment() {
    private val viewModel: MyViewModel by viewModels()

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.fragment_my, container, false)
    }
}

3.3 在 Activity 中使用 by viewModels()

Activity 中,可以使用 by viewModels() 委托来简化 ViewModel 的获取。

class MyActivity : AppCompatActivity() {
	private val viewModel: MyViewModel by viewModels()
	
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}

4. 总结

  • ViewModelProvider 是创建 ViewModel 的基本方式。
  • ViewModelFactory 可以用于传递参数给 ViewModel
  • by viewModels() 委托提供了一种更简洁的方式来获取 Fragment 中的 ViewModel

您可能感兴趣的与本文相关的镜像

Llama Factory

Llama Factory

模型微调
LLama-Factory

LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调

AndroidViewModel里直接获取LifecycleOwner并不符合ViewModel的设计理念,因为ViewModel的设计初衷是独立于视图和LifecycleOwner的生命周期,以保持数据的一致性和避免内存泄漏。不过,若确实有需求,可以通过一些变通方法来实现。 从参考内容可知,在lazy内部创建ViewModel实例时,可通过自定义ViewModelLifecycleOwner类型实现LifecycleOwner接口,内部维护一个LifecycleRegistry,这提供了一种创建LifecycleOwner的方式,但并非在ViewModel里获取LifecycleOwner [^1]。 通常情况下,有以下几种可行的方法: 1. **通过构造函数传递**:在创建ViewModel时,将LifecycleOwner作为参数传递给ViewModel。示例代码如下: ```kotlin class MyViewModel(private val lifecycleOwner: LifecycleOwner) : ViewModel() { // 使用lifecycleOwner } // 在Activity或Fragment中创建ViewModel val viewModel = ViewModelProvider(this).get(MyViewModel::class.java) { MyViewModel(this) } ``` 2. **使用回调接口**:定义一个接口,让Activity或Fragment实现该接口,在ViewModel中调用接口方法获取LifecycleOwner。示例代码如下: ```kotlin interface LifecycleOwnerProvider { fun getLifecycleOwner(): LifecycleOwner } class MyViewModel : ViewModel() { private var lifecycleOwnerProvider: LifecycleOwnerProvider? = null fun setLifecycleOwnerProvider(provider: LifecycleOwnerProvider) { this.lifecycleOwnerProvider = provider } fun getLifecycleOwner(): LifecycleOwner? { return lifecycleOwnerProvider?.getLifecycleOwner() } } // 在Activity或Fragment中实现接口 class MainActivity : AppCompatActivity(), LifecycleOwnerProvider { override fun getLifecycleOwner(): LifecycleOwner { return this } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val viewModel = ViewModelProvider(this).get(MyViewModel::class.java) viewModel.setLifecycleOwnerProvider(this) } } ```
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子林Android

感谢老板,老板大气!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值