【发布时间】:2020-03-21 03:17:20
【问题描述】:
我是 MVVM 的新手。所以我的片段/活动向服务器发出了 2 个请求,第一个请求的结果将用作第二个请求的输入参数。
所以首先在我的片段中,当一个按钮被点击时,我会请求检查用户是否被禁止,如果没有,那么这个用户可以创建一个帖子。
首先我检查用户是否被禁止在我的片段中使用此代码
class CreateEventFragment : Fragment() {
lateinit var model: CreateEventViewModel
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
model = ViewModelProvider(this).get(CreateEventViewModel::class.java)
button.setOnClickListener {
model.checkIfUserIsBanned()
}
}
}
这是视图模型
class CreateEventViewModel(application: Application) : AndroidViewModel(application) {
val mUserIsBanned :MutableLiveData<Boolean> = UserClient.mUserIsBanned
fun checkIfUserIsBanned(userID: String) {
UserRepository.checkIfUserIsBanned(id)
}
}
这里是客户端(为简单起见,我跳过了存储库)
object UserClient {
val mUserIsBanned = MutableLiveData<Boolean>()
fun checkIfUserIsBanned(userID: String) {
// perform networking, after getting the value then
if (user.isBanned) {
mUserIsBanned.postValue(true)
} else {
mUserIsBanned.postValue(false)
}
}
}
问题来了,第二个请求需要第一个结果的结果,即mUserIsBanned需要检查用户是否被禁止然后执行第二个请求(用户创建帖子)。我的问题是,我在哪里放置这个逻辑?在视图模型中还是在我的片段中?
if (userIsBanned == false) {
createPost()
}
从我看到的教程中,似乎总是在片段中观察到实时数据。所以第一个选择是将逻辑放在这样的片段中
model.mUserIsBanned.observe(viewLifecycleOwner, Observer { isBanned ->
val userIsBanned = isBanned ?: return@Observer
if (!userIsBanned) {
model.createPost()
}
})
可以在片段中进行这样的代码检查吗?
其实我不需要观察isBanned,我只需要检查一次
或者第二个选项是在 viewmodel 中检查 userIsBanned 与否,但我不知道如何在 viewmodel 中进行 livedata 观察
还是我的方法全错了?我不确定使用这个 MVVM
请帮忙,java也可以。
【问题讨论】:
-
我的意见是,检查用户是否被禁止是一次性的事情,它可能不会随时发生,所以这使它成为实时数据没有用,您可以直接将其用作普通布尔值并调用创建一个基于它的帖子。
-
是的,你是对的 Akshay,这只是一个单一的现场活动,你能显示代码如何实现吗?我很困惑
-
当然,你能解释一下你为什么使用客户端吗?是因为您想将所有 API 调用与视图模型分开吗?检查here
-
@AkshayNandwana 是的,将其与 viewModel 分开
-
@AkshayNandwana 可以将 API 调用放在 ViewModel 中吗?我是 MVVM 的新手,我只是按照我观看的教程通过在客户端中单独调用 API 来完成
标签: android kotlin android-livedata android-architecture-components android-viewmodel