【发布时间】:2021-10-28 19:06:12
【问题描述】:
深入了解函数insertUser和insertMoney的内部
我想将insertUser中id的值发送给insertMoney
并且 id 是一个变量
我已经尝试过 var idT,insertUser 有效,但在其他函数中,insertMoney 返回""。
这是我的视图模型:
var idT= ""
class AddUserViewModel(
val mUserInfoDAO: UserDAO,
val mTransactionDAO: TransactionsDAO,
val mLoan: LoanDAO,
val mBankDAO: BankDAO,
application: Application
) :
AndroidViewModel(application) {
var viewModelJob = Job()
val uiScope = CoroutineScope(Dispatchers.Main + viewModelJob)
fun insertUser(
fullName: String,
accountId: String,
mobileNumber: String,
phoneNumber: String,
dateOfCreation: String,
address: String,
) {
uiScope.launch {
try {
Log.d("TAG", "insertTest")
val user = UserInfo(
0L,
fullName,
accountId,
mobileNumber,
phoneNumber,
dateOfCreation,
address
)
withContext(Dispatchers.IO) {
#*#*#*#*#*#* I WANT TO SENT VALUE OF *id* TO insertMoney #*#*#*#*#*#*
val id = mUserInfoDAO.insert(user)
idT=id.toString()
Log.d("TAG", "insertUser: $idT")
}
} catch (e: Exception) {
Log.d("TAG", "insertContact: ${e.message}")
}
}
}
fun insertMoney(
amount: String,
increasePage: String?
) {
Log.d("TAG", "insertUserTTT: $idT")
var bankId: Long = bankInfo.value?.get(selectedItemPosition)?.bankId!!
uiScope.launch {
mTransactionDAO.insert(
Transaction(
0L,
*#*#*#*#*#HERE#*#*#*#*#*#
// id //,
null,
bankId,
null,
amount,
null,
null,
null,
increasePage
)
)
}
}
我在片段中调用这两个函数:
mAddUserViewModel.addUser.observe(viewLifecycleOwner, Observer {
if (it == true) {
mAddUserViewModel.insertUser(
mAddUserListBinding.fullName.text.toString(),
mAddUserListBinding.accountId.text.toString(),
mAddUserListBinding.mobileNumber.text.toString(),
mAddUserListBinding.phoneNumber.text.toString(),
mAddUserListBinding.createdDate.text.toString(),
mAddUserListBinding.edtAddress.text.toString(),
)
val firstMoney = "firstMoney"
mAddUserViewModel.insertMoney(
mAddUserListBinding.firstMoney.text.toString(),
firstMoney
)
findNavController().popBackStack()
}
})
【问题讨论】:
-
你是如何调用这些函数的?因为当您调用
withContext(Dispatchers.IO)时,这将导致insertUser中的协程挂起,从而允许uiScope 的线程拾取未挂起的协程(在insertMoney中创建的协程)。我猜你会在insertUser之后立即调用insertMoney,这两者都会立即返回,因为它们启动了协程。此外,如果协程无论如何都没有触及 UI,您应该避免使用Dispatchers.Main,而可能使用Dispatchers.Default。 -
所以感谢您的帮助我在片段中调用了这些函数,我得到了编辑文本的值并将它们插入到房间中。我更新了我的问题,请检查一下。 @undermark5
标签: android kotlin mvvm viewmodel