android - java.lang.RuntimeException:无法创建类 com.example.homeactivity.activities.editprofile.EditProfileViewModel 的实例
问题描述
当我启动我的应用程序时,它工作正常,但是当我单击“更改配置文件”时,它给了我这个错误:
java.lang.RuntimeException:无法启动活动 ComponentInfo{com.example.homeactivity/com.example.homeactivity.activities.editprofile.EditProfileActivity}:java.lang.RuntimeException:无法创建类 com.example.homeactivity.activities 的实例.editprofile.EditProfileViewModel 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2665) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726) 在 android.app.ActivityThread.-wrap12(ActivityThread.java) 在 android .app.ActivityThread$H.handleMessage(ActivityThread.java:1477) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:154) 在 android.app。 java.lang.reflect.Method 中的 ActivityThread.main(ActivityThread.java:6119)。在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 的 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 调用(本机方法) 原因:java。 lang.RuntimeException:无法在 androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:184) 在 androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider) 处创建 com.example.homeactivity.activities.editprofile.EditProfileViewModel 类的实例.java:241) 在 androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:164) 在 androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:130) 在 com.example.homeactivity.activity.editprofile.EditProfileActivity.onCreate( EditProfileActivity.kt:45) 在 android.app。Activity.performCreate(Activity.java:6679) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread .java:2726) 在 android.app.ActivityThread.-wrap12(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) 在 android.os.Handler.dispatchMessage(Handler.java:102 ) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6119) 在 java.lang.reflect.Method.invoke(Native Method) 在 com.android。 internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 在 com.android.internal.os.ZygoteInit。main(ZygoteInit.java:776) 原因:java.lang.InstantiationException:java.lang.Class 在 androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create( ViewModelProvider.java:182) 在 androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:241) 在 androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:164) 在 androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java :130) 在 com.example.homeactivity.activities.editprofile.EditProfileActivity.onCreate(EditProfileActivity.kt:45) 在 android.app.Activity.performCreate(Activity.java:6679) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.爪哇:1118) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726) 在 android.app.ActivityThread.-wrap12(ActivityThread.java) 在 android.app .ActivityThread$H.handleMessage(ActivityThread.java:1477) 在 android.app.ActivityThread 在 android.os.Looper.loop(Looper.java:154) 在 android.os.Handler.dispatchMessage(Handler.java:102)。 main(ActivityThread.java:6119) 在 java.lang.reflect.Method.invoke(Native Method) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 在 com.android.internal。 os.ZygoteInit.main(ZygoteInit.java:776)ActivityThread.handleLaunchActivity(ActivityThread.java:2726) 在 android.app.ActivityThread.-wrap12(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) 在 android.os.Handler.dispatchMessage( Handler.java:102) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6119) 在 java.lang.reflect.Method.invoke(Native Method)在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)ActivityThread.handleLaunchActivity(ActivityThread.java:2726) 在 android.app.ActivityThread.-wrap12(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) 在 android.os.Handler.dispatchMessage( Handler.java:102) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6119) 在 java.lang.reflect.Method.invoke(Native Method)在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)1477) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6119) 在 java.在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 的 lang.reflect.Method.invoke(Native Method) )1477) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6119) 在 java.在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 的 lang.reflect.Method.invoke(Native Method) )
我现在 7 天都无法摆脱这个错误......:/我知道我发布了太多代码,但我真的不知道如何解决它......
这是我的 EditProfileActivity.tk
class EditProfileActivity : AppCompatActivity(), PasswordDialog.Listener {
private lateinit var mViewModel: EditProfileViewModel
private val TAG = "EditProfileActivity"
private lateinit var mUser: User
private lateinit var mPendingUser: User
private lateinit var mFirebase: FirebaseHelper
private lateinit var mCamera: CameraHelper
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_edit_profile)
Log.d(TAG, "onCreate")
mCamera = CameraHelper(this)
close_image.setOnClickListener { finish() }
save_image.setOnClickListener { updateProfile() }
change_photo_text.setOnClickListener { mCamera.takeCameraPicture() }
mFirebase = FirebaseHelper(this)
mViewModel = ViewModelProviders.of(this).get(EditProfileViewModel::class.java)
mViewModel.user.observe(this, Observer{it?.let{
mUser = it
name_input.setText(mUser.name)
username_input.setText(mUser.username)
website_input.setText(mUser.website)
bio_input.setText(mUser.bio)
email_input.setText(mUser.email)
phone_input.setText(mUser.phone)
profile_image.loadUserPhoto((mUser.photo))
}})
}
@SuppressLint("MissingSuperCall")
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
if (requestCode == mCamera.REQUEST_CODE && resultCode == RESULT_OK) {
mViewModel.uploadAndSetUserPhoto(mCamera.imageUri!!).addOnFailureListener {
showToast(it.message)
}
}
}
private fun updateProfile() {
mPendingUser = readInputs()
val error = validate(mPendingUser)
if (error == null) {
if (mPendingUser.email == mUser.email) {
updateUser(mPendingUser)
} else {
PasswordDialog().show(supportFragmentManager, "password_dialog")
}
} else {
showToast(error)
}
}
private fun readInputs(): User {
return User(
name = name_input.text.toString(),
username = username_input.text.toString(),
email = email_input.text.toString(),
website = website_input.text.toStringOrNull(),
bio = bio_input.text.toStringOrNull(),
phone = phone_input.text.toStringOrNull()
)
}
override fun onPasswordConfirm(password: String) {
if (password.isNotEmpty()) {
val credential = EmailAuthProvider.getCredential(mUser.email, password)
mFirebase.reauthenticate(credential) {
mFirebase.updateEmail(mPendingUser.email) {
updateUser(mPendingUser)
}
}
} else {
showToast(getString(R.string.enter_your_password))
}
}
private fun updateUser(user: User) {
val updatesMap = mutableMapOf<String, Any?>()
if (user.name != mUser.name) updatesMap["name"] = user.name
if (user.username != mUser.username) updatesMap["username"] = user.username
if (user.website != mUser.website) updatesMap["website"] = user.website
if (user.bio != mUser.bio) updatesMap["bio"] = user.bio
if (user.email != mUser.email) updatesMap["email"] = user.email
if (user.phone != mUser.phone) updatesMap["phone"] = user.phone
mFirebase.updateUser(updatesMap) {
showToast(getString(R.string.profile_saved))
finish()
}
}
private fun validate(user: User): String? =
when {
user.name.isEmpty() -> getString(R.string.please_enter_name)
user.username.isEmpty() -> getString(R.string.please_enter_username)
user.email.isEmpty() -> getString(R.string.please_enter_email)
else -> null
}
}
我的 EditProfileViewModel.kt
class EditProfileViewModel(private val repository: EditProfileRepository) : ViewModel() {
val user: LiveData<User> = repository.getUser()
fun uploadAndSetUserPhoto(localImage: Uri): Task<Unit> =
repository.uploadUserPhoto(localImage).onSuccessTask{ downloadUrl ->
repository.updateUserPhoto(downloadUrl!!)
}
}
这是我的 EditProfileRepository.kt
interface EditProfileRepository {
fun getUser(): LiveData<User>
fun uploadUserPhoto(localImage: Uri): Task<Uri>
fun updateUserPhoto(downloadUrl: Uri): Task<Unit>
}
class FirebaseEditProfileRepository : EditProfileRepository {
override fun uploadUserPhoto(localImage: Uri): Task<Uri> =
storage.child("users/${currentUid()!!}/photo").putFile(localImage).onSuccessTask {
storage.child("users/${currentUid()!!}/photo").downloadUrl}.onSuccessTask {
Tasks.forResult(it!!)
}
override fun updateUserPhoto(downloadUrl: Uri): Task<Unit> =
database.child("users/${currentUid()!!}/photo").setValue(downloadUrl).toUnit()
override fun getUser(): LiveData<User> =
database.child("users").child(currentUid()!!).liveData().map {
it.asUser()!!
}
}
最后,这是我的 ViewModelFactory.kt
@Suppress("UNCHECKED_CAST")
class ViewModelFactory: ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(AddFriendsViewModel::class.java)){
return AddFriendsViewModel(FirebaseAddFriendsRepository()) as T
} else if (modelClass.isAssignableFrom(EditProfileViewModel::class.java)){
return EditProfileViewModel(FirebaseEditProfileRepository()) as T
}else {
error("Unknown view model class $modelClass")
}
}
}
解决方案
EditProfileViewModel
没有空的构造函数。因此,为了创建它的实例,您需要通过ViewModelFactory
.
你写了工厂,你只需要调用它。
代替
mViewModel = ViewModelProviders.of(this).get(EditProfileViewModel::class.java)
写
mViewModel = ViewModelProviders.of(this,
ViewModelFactory())
.get(EditProfileViewModel::class.java)
推荐阅读
- excel - VBA 数据透视表字段选择 Excel
- python - pandas - 将 d-mmm-yy 转换为日期时间对象
- java - 带有 JDBC 和 JSP 的 UPSERT MYSQL 命令
- xcode - 在将 facebook sdk 实施到 AppDelegate.m 文件时需要帮助
- css - 为什么 css 中的 inline-block 会产生奇怪的间距问题?
- python - 在 Python 中拆分文件中的数据
- java - 定义 Bean 时没有限定 Bean
- java - 当 JVM 退出时,Files.write 以一个空文件结束
- java - 二叉搜索树中的删除操作
- ansible - Ansible - 使用标签运行时导入的任务错误地运行