[英]Kotlin Multiplatform app crashes on start
当我运行我的应用程序时,它应该显示一个屏幕供用户创建帐户或登录。我让代码作为一个普通的 kotlin 应用程序工作,并决定制作一个多平台应用程序,所以我将项目重新制作为多平台。 KMM 不支持此代码:
import kotlinx.android.synthetic.main.activity_sign_in.*
所以我不得不改用 ViewBinding。 这是我之前使用的代码以及我将其更改为:
前:
import android.content.Intent
import android.os.Bundle
import android.widget.EditText
import com.cj.globekotlin.Extensions.toast
import com.cj.globekotlin.FirebaseUtils.firebaseAuth
import kotlinx.android.synthetic.main.activity_sign_in.*
class SignInActivity : AppCompatActivity() {
lateinit var signInEmail: String
lateinit var signInPassword: String
lateinit var signInInputsArray: Array<EditText>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_sign_in)
signInInputsArray = arrayOf(etSignInEmail, etSignInPassword)
btnCreateAccount2.setOnClickListener {
startActivity(Intent(this, CreateAccountActivity::class.java))
finish()
}
btnSignIn.setOnClickListener {
signInUser()
}
}
private fun notEmpty(): Boolean = signInEmail.isNotEmpty() && signInPassword.isNotEmpty()
private fun signInUser() {
signInEmail = etSignInEmail.text.toString().trim()
signInPassword = etSignInPassword.text.toString().trim()
if (notEmpty()) {
firebaseAuth.signInWithEmailAndPassword(signInEmail, signInPassword)
.addOnCompleteListener { signIn ->
if (signIn.isSuccessful) {
startActivity(Intent(this, HomeActivity::class.java))
toast("signed in successfully")
finish()
} else {
toast("sign in failed")
}
}
} else {
signInInputsArray.forEach { input ->
if (input.text.toString().trim().isEmpty()) {
input.error = "${input.hint} is required"
}
}
}
}
}
当前的:
import android.content.Intent
import android.os.Bundle
import android.widget.EditText
import com.cj.globemultiplatform.android.Extensions.toast
import com.cj.globemultiplatform.android.FirebaseUtils.firebaseAuth
import com.cj.globemultiplatform.android.databinding.ActivitySignInBinding
class SignInActivity : AppCompatActivity() {
lateinit var signInEmail: String
lateinit var signInPassword: String
lateinit var signInInputsArray: Array<EditText>
private lateinit var binding: ActivitySignInBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivitySignInBinding.inflate(layoutInflater)
setContentView(R.layout.activity_sign_in)
signInInputsArray = arrayOf(binding.etSignInEmail, binding.etSignInPassword)
binding.btnCreateAccount2.setOnClickListener {
startActivity(Intent(this, CreateAccountActivity::class.java))
finish()
}
binding.btnSignIn.setOnClickListener {
signInUser()
}
}
private fun notEmpty(): Boolean = signInEmail.isNotEmpty() && signInPassword.isNotEmpty()
private fun signInUser() {
signInEmail = binding.etSignInEmail.text.toString().trim()
signInPassword = binding.etSignInPassword.text.toString().trim()
if (notEmpty()) {
firebaseAuth.signInWithEmailAndPassword(signInEmail, signInPassword)
.addOnCompleteListener { signIn ->
if (signIn.isSuccessful) {
startActivity(Intent(this, HomeActivity::class.java))
toast("signed in successfully")
finish()
} else {
toast("sign in failed")
}
}
} else {
signInInputsArray.forEach { input ->
if (input.text.toString().trim().isEmpty()) {
input.error = "${input.hint} is required"
}
}
}
}
}
最初,我认为这会起作用,但现在每当我打开应用程序时,它就会崩溃。 我认为这种变化是导致崩溃的原因。 那可能吗? 如果是这样,我该如何解决这个问题?
你的安卓代码有几个问题:
binding = ActivitySignInBinding.inflate(layoutInflater)
setContentView(binding.root)
lateinit var
用于输入iables都在signInUser()方法中使用,但它不会被初始化。 我建议删除它并使用binding.signInEmail
和其他视图。此外,如果您尝试在 Android 和 iOS 之间共享代码,您应该意识到您需要抽象掉任何特定于平台的实现。 例如:目前所有特定于 android 的软件包都无法在 iOS 上运行。 这个特定的代码是相当重的 Android 平台,因此我什至不会尝试在 KMM 应用程序中共享它,只有业务逻辑,也许直到 ViewModel 层。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.