android - 片段如何通过 ViewModelInject 将 bundle 传递给 viewModel
问题描述
我使用 hilt 在 viewModel 中注入我想要的所有内容,我发现 hilt 通过 @ViewModelInject 支持 SavedStateHandle,因此如果我愿意,任何传递给它的捆绑数据都可以取回。
class TestViewModel @ViewModelInject constructor(
private val testRepository: TestRepository,
@Assisted private val state: SavedStateHandle
) : ViewModel() {
val testItem = state["test"] ?: "defaultValue"
}
@AndroidEntryPoint
class TestFragment : Fragment() {
private val viewModel: TestViewModel by viewModels() // How to pass bundle to the init viewModel?
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val binding = FragmentTestBinding.inflate(inflater)
binding.lifecycleOwner = this
binding.viewModel = viewModel
...
}
}
这似乎是使用 ViewModelFactory 用 bundle 初始化 viewModel 的方式。
interface ViewModelAssistedFactory<T : ViewModel> {
fun create(state: SavedStateHandle): T
}
class TestViewModelFactory @Inject constructor(
private val testRepository: TestRepository
) : ViewModelAssistedFactory<TestViewModel> {
fun create(handle: SavedStateHandle) {
return TestViewModel(handle, testRepository)
}
}
class TestViewModel(
private val state: SavedStateHandle
private val testRepository: TestRepository,
) : ViewModel() {
val id = state["test"] ?: "defaultValue"
}
解决方案
如果我正确理解您的问题,您希望实例化 ViewModel 并传入捆绑包,我怀疑Injecting ViewModel with Dagger Hilt文章可能会有所帮助。
向下滚动,有 2 个示例使用不同的方法来实例化 ViewModel,其中一个特别是传递 Bundle。
这是另一个很好的资源:没有更多工厂需要 ViewModel with Dependencies。
这就是我所做的,可能并不优雅,但效果很好:
class dataViewModel @ViewModelInject constructor(
val stateData: StateData,
@Assisted private val savedStateHandle: SavedStateHandle
): ViewModel() {
然后,要实例化 viewModel,您需要一个模块定义:
@Module
@InstallIn(ApplicationComponent::class)
class StateDataModule {
@Singleton
@Provides
fun provideStateData(): StateData {
return StateData(null, null)
}
}
然后,在使用它的类中,我设置值,ViewModel 保留所有实例和跨活动的值(这是我这样做的主要原因)。
dataViewModel.stateData.[property] = blah
推荐阅读
- r - ggplot 多个二进制变量,由另一个二进制变量分组
- java - Spring Data JdbcTemplate - 多个数据源 - 超过锁定等待超时
- python - Python中的字母层
- flutter - 从颤动的数据流中播放视频
- r - 在 RShiny 中使用 collapsibletree 包将 csv 转换为数据帧
- sql - 将动态 sql 转换为 T-SQL 中的键值对
- excel - 在月底更新并保存假期
- python - 未解决的参考“BaseHTTPServer”
- bash - 根据bash中CSV文件中的列值提取行
- android - 如何在 TableView android 中合并 2 个或多个单元格