Приложение сбоя из -за конструктора ViewModel бросил исключение во время его выполненияAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Приложение сбоя из -за конструктора ViewModel бросил исключение во время его выполнения

Сообщение Anonymous »

Я разрабатываю свое приложение для Android в Kotlin, которое имеет нижний ящик для навигации, а один фрагмент - это фрагмент контакта, в этом фрагменте нужен контактный доступ, и мы можем добавить этот контакт к экстренному контакту после нажатия кнопки, для этого я использовал базу данных комнаты, ViewModel.
ocntacts загружается в системе и отображается с использованием autocaze. /> После ввода номера в AutoCOMPLETETEXTVIEW он получен и выбран, но после нажатия кнопки «Сохранить» приложение продолжает сбой и показывает это сообщение об ошибке (с тегом AndroidRuntime): < /p>
java.lang.reflect.InvocationTargetException
at java.lang.reflect.Constructor.newInstance0(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:343)
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:314)
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:306)
< /code>
Я не использую какую -либо инъекцию зависимости.import android.app.Application
import android.util.Log
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.LiveData
import androidx.lifecycle.viewModelScope
import com.example.sentryone.ContactDatabase
import com.example.sentryone.EmergencyContact
import kotlinx.coroutines.launch

class ContactsViewModel (application: Application) : AndroidViewModel(application) {
private val dao = ContactDatabase.getDatabase(application).contactDao()

fun insert(contact: EmergencyContact) = viewModelScope.launch {
Log.d("TAGviewmodel", "insert: in contact viewmodel the issue must be here ")
dao.insert(contact)
Log.d("TAGvieemodel", "insert: the num is inserted in db ")
}

val allContacts: LiveData = dao.getAll()
}
< /code>
my dao class < /p>
import androidx.lifecycle.LiveData
import androidx.room.Dao
import androidx.room.Insert
import androidx.room.Query

@Dao
interface EmergencyContactDao {
@Insert
suspend fun insert(contact: EmergencyContact)

@Query("SELECT * FROM emergency_contacts")
fun getAll(): LiveData
}
< /code>
Это мой файл базы данных < /p>
import android.content.Context
import android.util.Log
import androidx.lifecycle.ViewModelProvider.NewInstanceFactory.Companion.instance
import androidx.room.Database
import androidx.room.InvalidationTracker
import androidx.room.Room
import androidx.room.RoomDatabase

@Database(entities = [EmergencyContact::class], version = 1)
abstract class ContactDatabase : RoomDatabase(){
abstract fun contactDao(): EmergencyContactDao

companion object {
@Volatile
private var INSTANCE : ContactDatabase? = null
fun getDatabase(context: Context): ContactDatabase {

Log.d("TAG", "getDatabase: databse is about to create")
return INSTANCE ?: synchronized(this) {
Log.d("TAG", "getDatabase: in the process of making db ")
val instance = Room.databaseBuilder(
context.applicationContext,
ContactDatabase::class.java,
"emergency_db"
)
.build()
// .also { INSTANCE = it }
INSTANCE = instance
instance
}
Log.d("TAG", "getDatabase: db created ")

}
}
}
< /code>
Это контактфрагмент < /p>
import android.content.pm.PackageManager
import android.os.Bundle
import android.provider.ContactsContract
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.widget.Toast
import androidx.core.content.ContextCompat
import com.example.sentryone.EmergencyContact
import com.example.sentryone.databinding.FragmentContactBinding
import com.example.sentryone.viewModels.ContactsViewModel
import android.Manifest
import android.util.Log
import androidx.fragment.app.viewModels

class ContactFragment : Fragment() {

private var _binding : FragmentContactBinding? = null
private val binding get() = _binding!!
private val viewModel: ContactsViewModel by viewModels()
private lateinit var contactSuggestions: List // name, phone

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding= FragmentContactBinding.inflate(inflater,container,false)
val view = binding.root
return view
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
checkContactPermission()

binding.btnAddContact.setOnClickListener {
// Check if contactSuggestions has been initialized before using it
if (!::contactSuggestions.isInitialized) {
Toast.makeText(requireContext(), "Contacts not loaded yet. Please try again.", Toast.LENGTH_SHORT).show()
return@setOnClickListener
}

val entered = binding.contactAutoComplete.text.toString()
Log.d("TAG", "onViewCreated: in contact frag num is entered")
val match = contactSuggestions.find { it.second.contains(entered) }
if (match != null) {
val contact = EmergencyContact(name = match.first, phoneNumber = match.second, type = "Friend")
Log.d("TAG", "onViewCreated: contact is $contact and contact is selected")
viewModel.insert(contact)
Toast.makeText(requireContext(), "Contact saved!", Toast.LENGTH_SHORT).show()
binding.contactAutoComplete.setText("")
} else {
Toast.makeText(requireContext(), "No matching contact found.", Toast.LENGTH_SHORT).show()
}
}
}



Подробнее здесь: https://stackoverflow.com/questions/796 ... n-during-i
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»