问题描述
我是 Android Studio 的新手。
我正在尝试创建一个登录页面,用户需要在其中输入电子邮件地址,数据库会将输入的电子邮件地址与数据库中的电子邮件地址进行比较。
我正在使用视图模型来处理任何与数据相关的任务。我正在使用协程访问数据库,因此应用程序不会崩溃。
我的问题是,如果我使用 loginviewmodel.checkEmailAddress().toString()
它只会将其显示为 kotlin.Unit
这不是我想要的,我想显示 user@mail.com
并且该电子邮件地址已经在自己的数据库中。
当用户输入正确的电子邮件地址并点击按钮后,它将转到下一个片段。到目前为止,它失败了,因为数据库总是返回 kotlin.Unit
。
这是片段:
class Login : Fragment() {
private lateinit var binding: LoginBinding
override fun onCreateView(
inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?
): View? {
binding = DataBindingUtil.inflate(
inflater,R.layout.login,container,false
)
val arguments = LoginArgs.fromBundle(requireArguments())
val application = requireNotNull(this.activity).application
val dataSource = ArchelonDatabase.getInstance(application).userDao
val viewmodelFactory = LoginviewmodelFactory(arguments.surveyKey,dataSource,application)
val loginviewmodel =
viewmodelProvider(this,viewmodelFactory).get(Loginviewmodel::class.java)
binding.loginviewmodel = loginviewmodel
binding.lifecycleOwner = this
binding.loginBtn.setonClickListener {
if (binding.email.text.toString() == loginviewmodel.checkEmailAddress().toString()) {
this.findNavController().navigate(
LoginDirections.actionLoginToMenuSelection()
)
} else {
val message = "nope"
Toast.makeText(requireActivity(),message,Toast.LENGTH_LONG).show()
}
}
return binding.root
}
}
这是视图模型:
class Loginviewmodel(
val database: UserDao,application: Application
) : Androidviewmodel(application) {
fun checkEmailAddress(
) {
Coroutinescope(dispatchers.Main.immediate).launch {
checkEmail()
}
}
private suspend fun checkEmail(): String {
return database.getEmailAddress()
}
}
这里是 DAO:
@Dao
interface UserDao {
// Update existing row if it's using the same ID
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insert(user: User)
@Query("SELECT email_address FROM user_table LIMIT 1")
suspend fun getEmailAddress() : String
}
解决方法
您的视图模型
private lateinit var _userEmailAdress = MutableLiveData<String>()
val userEmailAdress : LiveData<String>
get() = _userEmailAdress
fun checkEmailAddress(
) {
CoroutineScope(Dispatchers.Main.immediate).launch {
val userEmail = checkEmail()
_userEmailAdress.value = userEmail
}
}
你的片段
binding.loginBtn.setOnClickListener {
loginViewModel.checkEmailAddress()
loginViewModel.userEmailAdress.observer(viewLifecyleOwner,{
if(it == binding.email.text.toString()){
// your logic code
}
})
您的问题是该函数正在返回一个字符串值并尝试使用协程获取返回值。我试图在移动设备上准备一个模范概念。