[英]Kotlin Multiplatform app crashes on start
When I run my app, it is supposed to show a screen for a user to create an account or sign in. I had the code working as a regular kotlin app and decided to make a multiplatform app instead so I remade the project as multiplatform.当我运行我的应用程序时,它应该显示一个屏幕供用户创建帐户或登录。我让代码作为一个普通的 kotlin 应用程序工作,并决定制作一个多平台应用程序,所以我将项目重新制作为多平台。 KMM does not support this code:
KMM 不支持此代码:
import kotlinx.android.synthetic.main.activity_sign_in.*
so I had to change to ViewBinding.所以我不得不改用 ViewBinding。 Here is the code I used previously and what I changed it to:
这是我之前使用的代码以及我将其更改为:
Before:前:
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"
}
}
}
}
}
Current:当前的:
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"
}
}
}
}
}
Initially, I thought that this would work but now whenever I open the app, it crashes.最初,我认为这会起作用,但现在每当我打开应用程序时,它就会崩溃。 I think this change is what's causing the crashes.
我认为这种变化是导致崩溃的原因。 Is that possible?
那可能吗? If so, how can I fix this?
如果是这样,我该如何解决这个问题?
There are a couple of problems with your android code:你的安卓代码有几个问题:
binding = ActivitySignInBinding.inflate(layoutInflater)
setContentView(binding.root)
lateinit var
iables for the inputs are used in the signInUser() method, but it's not initialised.lateinit var
用于输入iables都在signInUser()方法中使用,但它不会被初始化。 I'd suggest removing that and using binding.signInEmail
and the other views.binding.signInEmail
和其他视图。 Also, if you're trying to share code between Android & iOS, you should be aware that you'll need to abstract away any platform specific implementation.此外,如果您尝试在 Android 和 iOS 之间共享代码,您应该意识到您需要抽象掉任何特定于平台的实现。 For ex: all packages that are android specific will not work on iOS at this moment.
例如:目前所有特定于 android 的软件包都无法在 iOS 上运行。 This specific code is pretty Android platform heavy, thus I wouldn't even try to share this in a KMM app, only business logic, perhaps up to a ViewModel layer.
这个特定的代码是相当重的 Android 平台,因此我什至不会尝试在 KMM 应用程序中共享它,只有业务逻辑,也许直到 ViewModel 层。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.