【问题标题】:Send data from one function to another将数据从一个函数发送到另一个函数
【发布时间】: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


【解决方案1】:

我解决了。

我混合了两个函数体 我删除了 insertMoney 函数并将其主体添加到 insertUser 并获得了 editText 的值并将其插入到 insert User 中

 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) {
                val id = mUserInfoDAO.insert(user)
                Log.d("TAG", "insertUser: $amount")
                val increasePage = "firstMoney"
                val bankId: Long = bankInfo.value?.get(selectedItemPosition)?.bankId!!
                mTransactionDAO.insert(
                    Transaction(
                        0L,
                        id,
                        null,
                        bankId,
                        null,
                        amount,
                        null,
                        null,
                        null,
                        increasePage
                    )
                )
            }

        } catch (e: Exception) {
            Log.d("TAG", "insertContact: ${e.message}")
        }

    }
}
private var username = ObservableField("").toString()
fun afterUserNameChange(s: CharSequence) {
    Log.i("truck", s.toString());
    amount = s.toString()
    this.username = s.toString()
}

【讨论】:

    【解决方案2】:
    fun insertUser(
        fullName: String,
        accountId: String,
        mobileNumber: String,
        phoneNumber: String,
        dateOfCreation: String,
        address: String,
        function:(Int,String,String)->Unit ,
        firstMoney:String  )  {
        uiScope.launch {
            try {
                Log.d("TAG", "insertTest")
                val user = UserInfo(
                    0L,
                    fullName,
                    accountId,
                    mobileNumber,
                    phoneNumber,
                    dateOfCreation,
                    address
                )
                 withContext(Dispatchers.IO) {
                    val id = mUserInfoDAO.insert(user)
    
                 function (id, firstMoney,"first money")
    
                }
            } catch (e: Exception) {
                Log.d("TAG", "insertContact: ${e.message}")
            }
        }   
      }
    
    insertUser(......,...,..., ::insertMoney,"30")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-24
      • 2018-12-10
      • 2018-07-29
      • 1970-01-01
      • 1970-01-01
      • 2018-08-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多