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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

子林Android

感谢老板,老板大气!

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

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

打赏作者

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

抵扣说明:

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

余额充值