通过 ViewModel 实现 Fragment 间的数据共享

1,469 阅读2分钟

在 Android 开发中,我们经常遇到需要在多个 Fragment 之间共享数据的情况。这种需求在开发复杂的用户界面时尤其常见,例如在使用 TabLayout 与 ViewPager 结合展示多个 Fragment 的场景中。传统的方法,如通过 Activity 作为中介或使用 EventBus 等第三方库来实现数据共享,虽然有效,但往往会带来额外的复杂性和维护难度。幸运的是,Android Architecture Components 提供了一种更加优雅的解决方案:共享 ViewModel。

什么是 ViewModel?

ViewModel 是一种设计用来存储和管理 UI 相关数据的类,它在配置更改(如屏幕旋转)时数据能够持续存活。通过将 ViewModel 与 LiveData 结合使用,我们可以创建响应式的应用组件,这些组件能够观察数据变化并进行相应的更新。

实现共享 ViewModel 的步骤

步骤 1: 创建共享 ViewModel

首先,我们需要创建一个 ViewModel 类来管理我们想在各个 Fragment 之间共享的数据。

import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel

class SharedViewModel : ViewModel() {
    val sharedData = MutableLiveData<String>()
}

在这个简单的例子中,我们创建了一个名为 sharedData 的 MutableLiveData 对象。这将是我们想要在 Fragment 之间共享的数据。

步骤 2: 在宿主 Activity 中获取 ViewModel 实例

接下来,在包含 ViewPager 的宿主 Activity 中,获取 ViewModel 的实例。这个实例将被所有子 Fragment 共享。

class MainActivity : AppCompatActivity() {
    private lateinit var viewModel: SharedViewModel

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

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

这里的关键是使用 ViewModelProvider 来获取一个 ViewModel 的实例,并且将 Activity 作为作用域,确保所有的 Fragment 都可以访问同一个 ViewModel 实例。

步骤 3: 在 Fragment 中访问共享 ViewModel

每个 Fragment 都可以访问这个共享的 ViewModel 实例,并根据需要观察或更新数据。

class FirstFragment : Fragment() {

    private lateinit var viewModel: SharedViewModel

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        viewModel = ViewModelProvider(requireActivity()).get(SharedViewModel::class.java)

        viewModel.sharedData.observe(viewLifecycleOwner, Observer { data ->
            // 这里可以更新 UI,例如设置 TextView 的文本
            textView.text = data
        })
    }

    fun updateData() {
        viewModel.sharedData.value = "Updated Data"
    }
}

在上面的代码中,FirstFragment 观察 sharedData。当数据发生变化时,Fragment 将响应这些变化并更新其 UI。

为什么这种方式更优?

使用共享 ViewModel 的方式允许我们将数据管理逻辑从 UI 控制器中分离出来,从而使我们的应用更加模块化。这不仅使代码更易于维护,而且提高了应用的可测试性。此外,由于 ViewModel 是生命周期感知的,它能够在配置更改后自动恢复状态,极大地简化了数据管理。

通过上述步骤,我们可以看到,在现代 Android 开发中,使用共享 ViewModel 来在 Fragment 之间共享数据不仅是可行的,而且是推荐的做法。这种方法不仅提高了代码的整洁性和效率,而且使得数据流在应用中的传递变得透明和安全。