gpt4 book ai didi

android - 将参数从 fragment 传递到 View 模型函数

转载 作者:行者123 更新时间:2023-12-04 16:38:15 25 4
gpt4 key购买 nike

你能告诉我我的方法是否正确吗?它有效,但我不知道它是否是正确的架构。我在某处读到,我们应该避免在负责创建 fragment/Activity 的函数上调用 viewmodel 函数,这主要是因为屏幕方向更改会调用网络请求,但我确实需要将参数从一个 View 模型传递到另一个 View 模型。重要的是我正在使用 Dagger Hilt 依赖注入(inject),所以为每个 View 模型创建工厂是不合理的?
假设我有项目的 RecyclerView 并且单击时我想启动带有详细信息的新 fragment - 常见的事情。因为这些屏幕的逻辑很复杂,我决定将单个 View 模型分成两个 - 一个用于列表 fragment ,一个用于详细信息 fragment 。
items structureItemsFragment使用以下代码具有监听器并启动详细信息 fragment :

    fun onItemSelected(item: Item) {
val args = Bundle().apply {
putInt(KEY_ITEM_ID, item.id)
}
findNavController().navigate(R.id.action_listFragment_to_detailsFragment, args)
}
然后在 ItemDetailsFragment类(class) onViewCreated函数我收到传递的参数,将其保存在 ItemDetailsViewModel itemId变量,然后启动 requestItemDetails()函数进行 api 调用,结果保存到 ItemDetailsFragment 观察到的 LiveData
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
//...
val itemId = arguments?.getInt(KEY_ITEM_ID, -1) ?: -1
viewModel.itemId = itemId
viewModel.requestItemDetails()
//...
}
ItemDetailsViewModel
class ItemDetailsViewModel @ViewModelInject constructor(val repository: Repository) : ViewModel() {

var itemId: Int = -1

private val _item = MutableLiveData<Item>()
val item: LiveData<Item> = _item

fun requestItemDetails() {
if (itemId == -1) {
// return error state
return
}

viewModelScope.launch {
val response = repository.getItemDetails(itemId)
//...
_item.postValue(response.data)
}
}
}

最佳答案

好消息是这就是 SavedStateHandle是 for,它自动接收参数作为其初始映射。

@HiltViewModel
class ItemDetailsViewModel @Inject constructor(
private val repository: Repository,
private val savedStateHandle: SavedStateHandle
) : ViewModel() {

private val itemId = savedStateHandle.getLiveData(KEY_ITEM_ID)

val item: LiveData<Item> = itemId.switchMap { itemId ->
liveData(viewModelScope.coroutineContext) {
emit(repository.getItemDetails(itemId).data)
}
}

关于android - 将参数从 fragment 传递到 View 模型函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66238882/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com