savedRecordFileName
是一个变量LivaData<String>
,我希望得到的值savedRecordFileName
立即在代码 A 中。
你知道 LiveData 变量是惰性的,也许它的值是savedRecordFileName
为空binding.btnStop.setOnClickListener { }
,所以代码中binding.btnStop.setOnClickListener { }
当值为savedRecordFileName
一片空白。
我希望代码中binding.btnStop.setOnClickListener { }
总是可以被解雇,我该怎么办?
顺便说一句,我认为代码 B 不合适,因为savedRecordFileName
可能会被其他功能改变。
Code B
binding.btnStop.setOnClickListener {
mHomeViewModel.savedRecordFileName.observe(viewLifecycleOwner){
val aMVoice = getDefaultMVoice(mContext,it)
mHomeViewModel.add(aMVoice)
}
}
Code A
class FragmentHome : Fragment() {
private val mHomeViewModel by lazy {
getViewModel {
HomeViewModel(mActivity.application, provideRepository(mContext))
}
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
...
binding.btnStop.setOnClickListener {
mHomeViewModel.savedRecordFileName.value?.let{
val aMVoice = getDefaultMVoice(mContext,it)
mHomeViewModel.add(aMVoice)
}
}
...
return binding.root
}
}
class HomeViewModel(val mApplication: Application, private val mDBVoiceRepository: DBVoiceRepository) : AndroidViewModel(mApplication) {
val savedRecordFileName: LiveData<String> = mDBVoiceRepository.getTotalOfVoice().map {
mApplication.getString(R.string.defaultName, (it+1).toString())
}
}
class DBVoiceRepository private constructor(private val mDBVoiceDao: DBVoiceDao){
fun getTotalOfVoice() = mDBVoiceDao.getTotalOfVoice()
}
@Dao
interface DBVoiceDao{
@Query("SELECT count(id) FROM voice_table")
fun getTotalOfVoice(): LiveData<Long>
}
添加内容
致里德库利:谢谢!
我认为你的方法“将所有这些移到 viewmodel 类中”很好!
我认为即使filename
livedata 在你的代码 C 中,对吧?
Code C
viewModelScope.launch(Dispatchers.IO) {
filename = dao.getFilename() // without livedata. I think it will be OK even if the filename is livedata
voice = getDefaultVoice(...) // also do this in background
add(voice)
result.postValue(true)
}