Сбой приложения при попытке доступа к экрану пользовательского интерфейса с помощью модели представленияAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Сбой приложения при попытке доступа к экрану пользовательского интерфейса с помощью модели представления

Сообщение Anonymous »

Что-то вроде продолжения этого: попытка подключить модель представления к экрану с помощью Jetpack Compose для базы данных помещений.
Мое приложение аварийно завершает работу, когда я пытаюсь получить доступ к экрану, на котором к нему прикреплена модель представления, все остальные экраны работают нормально.
Вот ошибка:

Код: Выделить всё

java.lang.RuntimeException: Cannot find implementation for com.example.fyp.EntryDatabase.  E n t r y D a t a b a s e _ I m p l   d o e s   n o t   e x i s t < b r   / >         a t   a n d r o i d x . r o o m . R o o m . g e t G e n e r a t e d I m p l e m e n t a t i o n ( R o o m . k t : 5 8 ) < b r   / >         a t   a n d r o i d x . r o o m . R o o m D a t a b a s e $ B u i l d e r . b u i l d ( R o o m D a t a b a s e . k t : 1 3 5 1 ) < b r   / >         a t   c o m . e x a m p l e . f y p . A p p M o d u l e . p r o v i d e D a t a b a s e ( A p p M o d u l e . k t : 2 4 ) < b r   / >         a t   c o m . e x a m p l e . f y p . A p p M o d u l e _ P r o v i d e D a t a b a s e F a c t o r y . p r o v i d e D a t a b a s e ( A p p M o d u l e _ P r o v i d e D a t a b a s e F a c t o r y . j a v a : 4 2 ) < b r   / >         a t   c o m . e x a m p l e . f y p . D a g g e r D a t a B a s e A p p l i c a t i o n _ H i l t C o m p o n e n t s _ S i n g l e t o n C $ S i n g l e t o n C I m p l $ S w i t c h i n g P r o v i d e r . g e t ( D a g g e r D a t a B a s e A p p l i c a t i o n _ H i l t C o m p o n e n t s _ S i n g l e t o n C . j a v a : 5 8 1 ) < b r   / >         a t   d a g g e r . i n t e r n a l . D o u b l e C h e c k . g e t ( D o u b l e C h e c k . j a v a : 4 7 ) < b r   / >         a t   c o m . e x a m p l e . f y p . D a g g e r D a t a B a s e A p p l i c a t i o n _ H i l t C o m p o n e n t s _ S i n g l e t o n C $ S i n g l e t o n C I m p l $ S w i t c h i n g P r o v i d e r . g e t ( D a g g e r D a t a B a s e A p p l i c a t i o n _ H i l t C o m p o n e n t s _ S i n g l e t o n C . j a v a : 5 7 8 ) < b r   / >         a t   d a g g e r . i n t e r n a l . D o u b l e C h e c k . g e t ( D o u b l e C h e c k . j a v a : 4 7 ) < b r   / >         a t   c o m . e x a m p l e . f y p . D a g g e r D a t a B a s e A p p l i c a t i o n _ H i l t C o m p o n e n t s _ S i n g l e t o n C $ S i n g l e t o n C I m p l $ S w i t c h i n g P r o v i d e r . g e t ( D a g g e r D a t a B a s e A p p l i c a t i o n _ H i l t C o m p o n e n t s _ S i n g l e t o n C . j a v a : 5 7 5 ) < b r   / >         a t   d a g g e r . i n t e r n a l . D o u b l e C h e c k . g e t ( D o u b l e C h e c k . j a v a : 4 7 ) < b r   / >         a t   c o m . e x a m p l e . f y p . D a g g e r D a t a B a s e A p p l i c a t i o n _ H i l t C o m p o n e n t s _ S i n g l e t o n C $ V i e w M o d e l C I m p l $ S w i t c h i n g P r o v i d e r . g e t ( D a g g e r D a t a B a s e A p p l i c a t i o n _ H i l t C o m p o n e n t s _ S i n g l e t o n C . j a v a : 4 4 1 ) < b r   / >         a t   d a g g e r . h i l t . a n d r o i d . i n t e r n a l . l i f e c y c l e . H i l t V i e w M o d e l F a c t o r y $ 1 . c r e a t e ( H i l t V i e w M o d e l F a c t o r y . j a v a : 1 0 2 ) < b r   / >         a t   a n d r o i d x . l i f e c y c l e . A b s t r a c t S a v e d S t a t e V i e w M o d e l F a c t o r y . c r e a t e ( A b s t r a c t S a v e d S t a t e V i e w M o d e l F a c t o r y . k t : 9 0 ) < b r   / >         a t   d a g g e r . h i l t . a n d r o i d . i n t e r n a l . l i f e c y c l e . H i l t V i e w M o d e l F a c t o r y . c r e a t e ( H i l t V i e w M o d e l F a c t o r y . j a v a : 1 1 4 ) < b r   / >         a t   a n d r o i d x . l i f e c y c l e . V i e w M o d e l P r o v i d e r . g e t ( V i e w M o d e l P r o v i d e r . k t : 1 8 4 ) < b r   / >         a t   a n d r o i d x . l i f e c y c l e . V i e w M o d e l P r o v i d e r . g e t ( V i e w M o d e l P r o v i d e r . k t : 1 5 0 ) < b r   / >         a t   a n d r o i d x . l i f e c y c l e . v i e w m o d e l . c o m p o s e . V i e w M o d e l K t . g e t ( V i e w M o d e l . k t : 2 1 5 ) < b r   / >         a t   a n d r o i d x . l i f e c y c l e . v i e w m o d e l . c o m p o s e . V i e w M o d e l K t . v i e w M o d e l ( V i e w M o d e l . k t : 1 5 6 ) < b r   / >         a t   c o m . e x a m p l e . f y p . A d d E n t r y S c r e e n K t . A d d J o u r n a l S c r e e n ( A d d E n t r y S c r e e n . k t : 2 8 4 ) < b r   / >         a t   c o m . e x a m p l e . f y p . A p p N a v i g a t i o n K t $ A p p N a v i g a t i o n $ 1 $ 8 . i n v o k e ( A p p N a v i g a t i o n . k t : 5 4 ) < b r   / >         a t   c o m . e x a m p l e . f y p . A p p N a v i g a t i o n K t $ A p p N a v i g a t i o n $ 1 $ 8 . i n v o k e ( A p p N a v i g a t i o n . k t : 5 3 ) < b r   / >         a t   a n d r o i d x . c o m p o s e . r u n t i m e . i n t e r n a l . C o m p o s a b l e L a m b d a I m p l . i n v o k e ( C o m p o s a b l e L a m b d a . j v m . k t : 1 3 9 ) < b r   / >         a t   a n d r o i d x . c o m p o s e . r u n t i m e . i n t e r n a l . C o m p o s a b l e L a m b d a I m p l . i n v o k e ( C o m p o s a b l e L a m b d a . j v m . k t : 3 5 ) < b r   / >         a t   a n d r o i d x . n a v i g a t i o n . c o m p o s e . N a v H o s t K t $ N a v H o s t $ 1 4 $ 1 . i n v o k e ( N a v H o s t . k t : 3 0 8 ) < b r   / >         a t   a n d r o i d x . n a v i g a t i o n . c o m p o s e . N a v H o s t K t $ N a v H o s t $ 1 4 $ 1 . i n v o k e ( N a v H o s t . k t : 3 0 6 ) < b r   / >         a t   a n d r o i d x . c o m p o s e . r u n t i m e . i n t e r n a l . C o m p o s a b l e L a m b d a I m p l . i n v o k e ( C o m p o s a b l e L a m b d a . j v m . k t : 1 0 9 ) < b r   / >         a t   a n d r o i d x . c o m p o s e . r u n t i m e . i n t e r n a l . C o m p o s a b l e L a m b d a I m p l . i n v o k e ( C o m p o s a b l e L a m b d a . j v m . k t : 3 5 ) < b r   / >         a t   a n d r o i d x . c o m p o s e . r u n t i m e . C o m p o s i t i o n L o c a l K t . C o m p o s i t i o n L o c a l P r o v i d e r ( C o m p o s i t i o n L o c a l . k t : 2 4 8 ) < b r   / >         a t   a n d r o i d x . c o m p o s e . r u n t i m e . s a v e a b l e . S a v e a b l e S t a t e H o l d e r I m p l . S a v e a b l e S t a t e P r o v i d e r ( S a v e a b l eStateHolder.kt:84)
at androidx.navigation.compose.NavBackStackEntryProviderKt.SaveableStateProvider(NavBackStackEntryProvider.kt:65)
at androidx.navigation.compose.NavBackStackEntryProviderKt.access$SaveableStateProvider(NavBackStackEntryProvider.kt:1)
at androidx.navigation.compose.NavBackStackEntryProviderKt$LocalOwnersProvider$1.invoke(NavBackStackEntryProvider.kt:52)
at androidx.navigation.compose.NavBackStackEntryProviderKt$LocalOwnersProvider$1.invoke(NavBackStackEntryProvider.kt:51)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:109)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:228)
at androidx.navigation.compose.NavBackStackEntryProviderKt.LocalOwnersProvider(NavBackStackEntryProvider.kt:47)
at androidx.navigation.compose.NavHostKt$NavHost$14.invoke(NavHost.kt:306)
at androidx.navigation.compose.NavHostKt$NavHost$14.invoke(NavHost.kt:295)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:139)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
at androidx.compose.animation.AnimatedContentKt$AnimatedContent$6$1$5.invoke(AnimatedContent.kt:755)
at androidx.compose.animation.AnimatedContentKt$AnimatedContent$6$1$5.invoke(AnimatedContent.kt:744)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:118)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
at androidx.compose.animation.AnimatedVisibilityKt.AnimatedEnterExitImpl(AnimatedVisibility.kt:818)
at androidx.compose.animation.AnimatedContentKt$AnimatedContent$6$1.invoke(AnimatedContent.kt:726)
at androidx.compose.animation.AnimatedContentKt$AnimatedContent$6$1.invoke(AnimatedContent.kt:709)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:109)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
at androidx.compose.animation.AnimatedContentKt.AnimatedContent(AnimatedContent.kt:768)
at androidx.navigation.compose.NavHostKt.NavHost(NavHost.kt:273)
at androidx.navigation.compose.NavHostKt$NavHost$17.invoke(Unknown Source:27)
at androidx.navigation.compose.NavHostKt$NavHost$17.invoke(Unknown Source:10)
at androidx.compose.runtime.RecomposeScopeImpl.compose(RecomposeScopeImpl.kt:192)
at androidx.compose.runtime.ComposerImpl.recomposeToGroupEnd(Composer.kt:2556)
at androidx.compose.runtime.ComposerImpl.skipCurrentGroup(Composer.kt:2827)
at androidx.compose.runtime.ComposerImpl.doCompose(Composer.kt:3314)
at androidx.compose.runtime.ComposerImpl.recompose$runtime_release(Composer.kt:3265)
at androidx.compose.runtime.CompositionImpl.recompose(Composition.kt:940)
at androidx.compose.runtime.Recomposer.performRecompose(Recomposer.kt:1155)
at androidx.compose.runtime.Recomposer.access$performRecompose(Recomposer.kt:127)
at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$1.invoke(Recomposer.kt:583)
at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$1.invoke(Recomposer.kt:551)
at androidx.compose.ui.platform.AndroidUiFrameClock$withFrameNanos$2$callback$1.doFrame(AndroidUiFrameClock.android.kt:41)
at androidx.compose.ui.platform.AndroidUiDispatcher.performFrameDispatch(AndroidUiDispatcher.android.kt:109)
at androidx.compose.ui.platform.AndroidUiDispatcher.access$performFrameDispatch(AndroidUiDispatcher.android.kt:41)
at androidx.compose.ui.platform.AndroidUiDispatcher$dispatchCallback$1.doFrame(AndroidUiDispatcher.android.kt:69)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1229)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1239)
at android.view.Choreographer.doCallbacks(Choreographer.java:899)
at android.view.Choreographer.doFrame(Choreographer.java:827)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1214)
at android.os.Handler.handleCallback(Handler.java:942)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:201)
at android.os.Looper.loop(Looper.java:288)
at android.app.ActivityThread.main(ActivityThread.java:7872)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
Suppressed:  kotlinx.coroutines.internal.DiagnosticCoroutineContextException: [androidx.compose.runtime.PausableMonotonicFrameClock@d039df3, androidx.compose.ui.platform.MotionDurationScaleImpl@19c7ab0, StandaloneCoroutine{Cancelling}@1220d29, AndroidUiDispatcher@23848ae]
Вот градиент проекта:

Код: Выделить всё

plugins {
id("com.android.application") version "8.2.0" apply false
id("org.jetbrains.kotlin.android") version "1.9.0" apply false
id("com.google.dagger.hilt.android") version "2.48" apply false
id("com.google.devtools.ksp") version "1.9.0-1.0.12" apply false
}
Градус модуля:

Код: Выделить всё

plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
kotlin("kapt")
id("com.google.dagger.hilt.android")
id("com.google.devtools.ksp")
}

android {
namespace = "com.example.fyp"
compileSdk = 34

defaultConfig {
applicationId = "com.example.fyp"
minSdk = 26 //Change from 24
targetSdk = 34
versionCode = 1
versionName = "1.0"

testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {
useSupportLibrary = true
}
}

buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
}
buildFeatures {
compose = true
}
composeOptions {
kotlinCompilerExtensionVersion = "1.5.1"
}
packaging {
resources {
excludes += "/META-INF/{AL2.0,LGPL2.1}"
}
}
}

dependencies {
implementation("androidx.core:core-ktx:1.12.0")
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.7.0")
implementation("androidx.activity:activity-compose:1.8.2")
implementation(platform("androidx.compose:compose-bom:2023.08.00"))
implementation("androidx.compose.ui:ui")
implementation("androidx.compose.ui:ui-graphics")
implementation("androidx.compose.ui:ui-tooling-preview")
implementation("androidx.compose.material:material:1.6.4")
implementation("androidx.compose.material3:material3-android:1.2.1")
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.1.5")
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
androidTestImplementation(platform("androidx.compose:compose-bom:2023.08.00"))
androidTestImplementation("androidx.compose.ui:ui-test-junit4")
debugImplementation("androidx.compose.ui:ui-tooling")
debugImplementation("androidx.compose.ui:ui-test-manifest")
val nav_version = "2.7.6"
implementation("androidx.navigation:navigation-compose:$nav_version")
implementation("androidx.room:room-ktx:2.6.1") //Room
implementation("co.yml:ycharts:2.1.0") //YChart (3rd Party)
implementation("androidx.core:core-splashscreen:1.0.1") //Splash screen

//Hilt Dependencies
val daggerHiltVersion = "2.48"
implementation("com.google.dagger:hilt-android:$daggerHiltVersion")
ksp("com.google.dagger:hilt-android-compiler:$daggerHiltVersion")
ksp("androidx.hilt:hilt-compiler:1.1.0")
implementation("androidx.hilt:hilt-navigation-compose:1.1.0")
}

kapt {
correctErrorTypes = true
}
модель просмотра

Код: Выделить всё

@HiltViewModel
class EntryViewModel @Inject constructor(private val repository: DataRepository) : ViewModel() {
private val _entries = mutableStateOf(emptyList())
val entries: State  = _entries

init {
loadEntryList()
}

private fun loadEntryList() {
viewModelScope.launch {
_entries.value = repository.getEntryFromDate()
}
}

suspend fun saveEntry(entry: Entry) {
viewModelScope.launch {
repository.saveEntry(entry)
}
}
}
код экрана, на котором произошел сбой:

Код: Выделить всё

@Composable
fun AddJournalScreen(
navController: NavController,
entry: Entry? = null,
viewModel: EntryViewModel = hiltViewModel(),
) {
//Calendar Date/Time Variables
val currentDateAndTime = Calendar.getInstance().time //Get current date and time
val dateFormat = DateFormat.getDateInstance().format(currentDateAndTime) //Format date for the screen
val timeFormat = DateFormat.getTimeInstance(DateFormat.SHORT).format(currentDateAndTime) //Format time for the screen
val changeDateToMilis = Calendar.getInstance().timeInMillis //Convert date to Long data type for storing into database

//Drop Down Menu
var expandedList by remember { mutableStateOf(false) }
var selectedItem by remember { mutableStateOf("") }
var textFiledSize by remember { mutableStateOf(Size.Zero) }
val icon = if (expandedList) {
Icons.Filled.KeyboardArrowUp
} else {
Icons.Filled.KeyboardArrowDown
}

//List of emotions from Plutchik's wheel of emotion
val emotionList = listOf("ecstasy", "joy", "serenity", "admiration", "trust", "acceptance",
"terror", "fear", "apprehension", "amazement", "surprise", "distraction", "grief",
"sadness", "pensiveness", "loathing", "disgust", "boredom", "rage", "anger", "annoyance",
"vigilance", "anticipation", "interest", "optimism", "love", "submission", "awe", "disapproval",
"remorse", "contempt", "aggressiveness")

//For journal input
var journal by remember {
mutableStateOf(
if (entry?.journalEntry == null) {
""
} else {
entry.journalEntry
}
)
}

val coroutineScope = rememberCoroutineScope()

Column(
modifier = Modifier
.fillMaxSize()
.background(Color.White)
) {
Spacer(modifier = Modifier.height(20.dp))
Column(
horizontalAlignment = Alignment.CenterHorizontally,
modifier = Modifier
.height(200.dp)
.size(500.dp)
)
{
Text(text = "Date: $dateFormat", fontSize = 20.sp)
Spacer(
modifier = Modifier
.size(10.dp)
.height(10.dp)
)
Spacer(
modifier = Modifier
.size(10.dp)
.height(10.dp)
)
Text(text = "Time:  $timeFormat", fontSize = 20.sp, fontFamily = FontFamily.Serif)
Spacer(
modifier = Modifier
.size(10.dp)
.height(10.dp)
)
Spacer(
modifier = Modifier
.size(80.dp)
.height(80.dp)
)
}
Row(modifier = Modifier
.width(220.dp)
.height(100.dp)
) {
Spacer(
modifier = Modifier
.width(10.dp)
)
OutlinedTextField(
value = selectedItem,
onValueChange = { selectedItem = it },
modifier = Modifier
.width(200.dp)
.onGloballyPositioned { coordinates ->
textFiledSize = coordinates.size.toSize()
},
label = { Text(text = "Select Emotion") },
trailingIcon = {
Icon(icon, "",
Modifier.clickable { expandedList = !expandedList })
}

)
DropdownMenu(
expanded = expandedList,
onDismissRequest = { expandedList = false },
modifier = Modifier
.width(with(LocalDensity.current) { textFiledSize.width.toDp() }),
) {
emotionList.forEach { label ->
DropdownMenuItem(onClick = {
selectedItem = label
expandedList = false
}) {
Text(text = label)
}
}
}
Spacer(
modifier = Modifier
.width(30.dp)
)
}
Row(modifier = Modifier
.width(200.dp)
.height(20.dp)
) {
Spacer(
modifier = Modifier
.width(15.dp)
)
Text(text = "Input your thoughts...",  fontStyle = FontStyle.Italic)
}
Box(modifier = Modifier
.size(400.dp)
.padding(10.dp)
.align(Alignment.CenterHorizontally)
) {
//var inputText by remember { mutableStateOf("") }
val maxCharLimit = 200
TextField(
value = journal,
onValueChange = {
if (it.length 

Подробнее здесь: [url]https://stackoverflow.com/questions/78319073/app-crashing-when-trying-to-access-a-ui-screen-with-the-view-model[/url]
Ответить

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

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

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

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

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