我从使用 MVVM 的改造中得到了多个响应 - kotlin
I get multiple response from retrofit using MVVM - kotlin
我刚开始学习 MVVM,我无法找出为什么我多次收到改造的响应。
我正在观看有关如何在 kotlin 中实现 MVVM 的视频,如果您提出更好的方法,我将非常高兴。
这是 存储库(我正在使用 jsonplaceholder 获取用户):
class HelpersRepository(val application: Application) {
val showProgress = MutableLiveData<Boolean>()
val helpersList = MutableLiveData<List<Helpers>>()
fun getAllHelpers() {
showProgress.value = true
val destinationService = ServiceBuilder.buildService(HelpersNetwork::class.java)
val requestCall = destinationService.getHelpers()
requestCall.enqueue(object : Callback<List<Helpers>>{
override fun onResponse(call: Call<List<Helpers>>, response: Response<List<Helpers>>) {
helpersList.value = response.body()
Log.d("response", "${helpersList.value}")
showProgress.value = false
}
override fun onFailure(call: Call<List<Helpers>>, t: Throwable) {
showProgress.value = false
Toast.makeText(application, "Error while fetching the data", Toast.LENGTH_SHORT).show()
}
})
}}
这是 ViewModel:
class HelpersViewModel(application: Application) : AndroidViewModel(application) {
private val repository = HelpersRepository(application)
val showProgress : LiveData<Boolean>
val helpersList : LiveData<List<Helpers>>
init {
this.showProgress = repository.showProgress
this.helpersList = repository.helpersList
}
fun getAllHelpers() {
repository.getAllHelpers()
}
}
这是我的片段:
class HelpersFragment : Fragment() {
private lateinit var viewModel: HelpersViewModel
private lateinit var adapter: HelpersAdapter
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_helpers, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModel = ViewModelProvider(this).get(HelpersViewModel::class.java)
adapter = HelpersAdapter(requireContext())
rv_helpers.adapter = adapter
viewModel.getAllHelpers()
viewModel.showProgress.observe(viewLifecycleOwner, Observer {
if (it) {
pb_helpers.visibility = View.VISIBLE
} else {
pb_helpers.visibility = View.GONE
}
})
viewModel.helpersList.observe(viewLifecycleOwner, Observer {
adapter.setHelpersList(it)
})
}
}
当在片段中调用 viewModel.getAllHelpers()
时,日志会显示三次响应(我无法复制日志,因为 Whosebug 将其视为垃圾邮件)。
P.S。如果我将 viewModel.getAllHelpers()
放在 setOnclickListener
on 按钮中,那么它只会获取一次数据。
我到处搜索,但无法找到适合我的问题的答案。我意识到我做错了什么,但无法弄清楚到底是什么
我终于弄清楚我的问题来自于在 MainActivity 中选择暗模式。结果你必须打电话:
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
在 setContentView()
之前 onCreate
我刚开始学习 MVVM,我无法找出为什么我多次收到改造的响应。 我正在观看有关如何在 kotlin 中实现 MVVM 的视频,如果您提出更好的方法,我将非常高兴。
这是 存储库(我正在使用 jsonplaceholder 获取用户):
class HelpersRepository(val application: Application) {
val showProgress = MutableLiveData<Boolean>()
val helpersList = MutableLiveData<List<Helpers>>()
fun getAllHelpers() {
showProgress.value = true
val destinationService = ServiceBuilder.buildService(HelpersNetwork::class.java)
val requestCall = destinationService.getHelpers()
requestCall.enqueue(object : Callback<List<Helpers>>{
override fun onResponse(call: Call<List<Helpers>>, response: Response<List<Helpers>>) {
helpersList.value = response.body()
Log.d("response", "${helpersList.value}")
showProgress.value = false
}
override fun onFailure(call: Call<List<Helpers>>, t: Throwable) {
showProgress.value = false
Toast.makeText(application, "Error while fetching the data", Toast.LENGTH_SHORT).show()
}
})
}}
这是 ViewModel:
class HelpersViewModel(application: Application) : AndroidViewModel(application) {
private val repository = HelpersRepository(application)
val showProgress : LiveData<Boolean>
val helpersList : LiveData<List<Helpers>>
init {
this.showProgress = repository.showProgress
this.helpersList = repository.helpersList
}
fun getAllHelpers() {
repository.getAllHelpers()
}
}
这是我的片段:
class HelpersFragment : Fragment() {
private lateinit var viewModel: HelpersViewModel
private lateinit var adapter: HelpersAdapter
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_helpers, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModel = ViewModelProvider(this).get(HelpersViewModel::class.java)
adapter = HelpersAdapter(requireContext())
rv_helpers.adapter = adapter
viewModel.getAllHelpers()
viewModel.showProgress.observe(viewLifecycleOwner, Observer {
if (it) {
pb_helpers.visibility = View.VISIBLE
} else {
pb_helpers.visibility = View.GONE
}
})
viewModel.helpersList.observe(viewLifecycleOwner, Observer {
adapter.setHelpersList(it)
})
}
}
当在片段中调用 viewModel.getAllHelpers()
时,日志会显示三次响应(我无法复制日志,因为 Whosebug 将其视为垃圾邮件)。
P.S。如果我将 viewModel.getAllHelpers()
放在 setOnclickListener
on 按钮中,那么它只会获取一次数据。
我到处搜索,但无法找到适合我的问题的答案。我意识到我做错了什么,但无法弄清楚到底是什么
我终于弄清楚我的问题来自于在 MainActivity 中选择暗模式。结果你必须打电话:
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
在 setContentView()
之前 onCreate