android - 基于传递给片段的参数,具有不同 ViewModel 类型的相同片段类型的多个实例
问题描述
我有 ViewPager2 的应用程序。其中的所有页面都是相同类型片段的实例。所有页面都在回收视图中显示不同数据类型的一些列表。使用 Retrofit 调用从某个 API 端点填充数据。
我正在使用 dagger 2 来注入视图模型。
一页一切正常。现在我想创建其他页面,我问是否有任何方法/模式来实现其他页面而不创建不同的片段类,但只使用不同的 viewModel 类型?
也许是一些通用的 viewModel 之类的。
解决方案
页面类型
enum class PageType {
Page1, Page2, Page3;
}
val PageType.viewModelClass: KClass<out GenericViewModel>
get() = when (this) {
PageType.Page1 -> Page1ViewModel::class
// todo
}
视图模型
abstract class GenericViewModel<T>() : BaseViewModel() {
abstract val pageType: PageType
}
class Page1ViewModel @Inject constructor() : GenericViewModel() {
override val pageType: PageType = PageType.Page1
}
分段
class PageFragment : BaseFragment() {
private val pageType: PageType by lazy {
TODO("read from arguments bundle")
}
private val vm: GenericViewModel by lazy {
ViewModelProvider(this, viewModelFactory).get(pageType.viewModelClass.java)
}
companion object {
fun newInstance(type: PageType): PageFragment {
TODO("add type into bundle and set as arguments")
}
}
}
如果您当前的 dagger 设置适用于视图模型,那么您无需执行任何特殊操作即可支持此模式。
推荐阅读
- linux - 如何为 http 到 https 配置自签名到 localhost?
- excel - 如何在 vba 中从我的用户窗体调用模块?
- python - 如何在 Python 中开始这个类型转换作业?
- macos - 为什么 Rust 会发出 280 行汇编代码来打印“Hello, world”?
- jquery - Bootstrap 弹出框需要单击两次才能打开弹出框
- android - 更改软键盘高度
- java - 无法使用 Scanner Java 读取斜杠 ( / )
- ios - 从 Pushwoosh 切换后 OneSignal 订阅者未更新
- api - salesforcerest.update 在 WSO2 EI 6.1.1 中不起作用
- c++ - C++ 这个函数调用之前的 (void) 有什么作用?