inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

173만명의 커뮤니티!! 함께 토론해봐요.

ViewModel 사용 관련 질문

미해결

모던 안드로이드 - Jetpack Compose 입문

안녕하세요, 비만도 계산기 강의를 수강하면서 코드를 작성하고 말씀하신 내용들을 학습했는데요. "bmi state를 통해 bmi값이 변경되면 설정한 콜백이 동작하며 결과화면이 recomposition되고, 네비게이션 컨트롤러로 해당 화면으로 이동한다" 라고 이해했는데요, navController.navigate("result") 가 수행되면 composable(route = Screen.Result.route) { ResultScreen( bmi = viewModel.bmi.value, onBackClick = { navController.popBackStack() } ) } 부분이 실행되기 때문에 bmi가 State가 아니고 지역변수여도 원하는 화면이 나올것이라고 생각해서 코드를 변경했는데 실제로 기존과 동일하게 잘 동작하는것을 확인하였습니다. 본 강의에서는 지역변수를 활용해서도 동작이 되지만, UI와 로직을 분리하는 장점이 있으며 ViewModel이 많이 사용되니 사용하신것으로 이해하면 될까요? 아래는 지역변수로 변경한 코드입니다 package com.example.obesitymachine import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import androidx.compose.foundation.Image import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.ArrowBack import androidx.compose.material3.Button import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.runtime.Composable import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController import kotlin.math.pow sealed class Screen(val route: String) { data object Home : Screen("home") data object Result: Screen("result") } class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() setContent { val navController = rememberNavController() var bmi = 0.0 NavHost(navController = navController, startDestination = Screen.Home.route) { composable(route = Screen.Home.route) { HomeScreen( onResultClick = {height, weight -> bmi = bmiCalculate(height, weight) navController.navigate(Screen.Result.route) } ) } composable(route = Screen.Result.route) { ResultScreen( bmi = bmi, onBackClick = { navController.popBackStack() } ) } } } } } @OptIn(ExperimentalMaterial3Api::class) @Composable fun HomeScreen( modifier: Modifier = Modifier, onResultClick: (height: Double, weight: Double) -> Unit ) { val (height, setHeight) = rememberSaveable { mutableStateOf("") } val (weight, setWeight) = rememberSaveable { mutableStateOf("") } Scaffold( topBar = { TopAppBar( title = { Text("비만도 측정기") } ) } ) { Box( modifier.padding(it) ) { Column( modifier .fillMaxSize() .padding(8.dp) ) { OutlinedTextField( value = height, onValueChange = setHeight, label = { Text("키") }, keyboardOptions = KeyboardOptions( keyboardType = KeyboardType.Number ), modifier = Modifier.fillMaxWidth() ) OutlinedTextField( value = weight, onValueChange = setWeight, label = { Text("몸무게") }, keyboardOptions = KeyboardOptions( keyboardType = KeyboardType.Number ), modifier = Modifier.fillMaxWidth() ) Button( modifier = Modifier.align(Alignment.End), onClick = { onResultClick(height.toDouble(), weight.toDouble()) } ) { Text("결과") } } } } } @OptIn(ExperimentalMaterial3Api::class) @Composable fun ResultScreen( bmi: Double, onBackClick: () -> Unit ) { val text = when { bmi > 25 -> "과체중" bmi > 18.5 -> "정상" else -> "저체중" } val icon = when { bmi > 25 -> R.drawable.baseline_sentiment_very_dissatisfied_24 bmi > 18.5 -> R.drawable.baseline_sentiment_satisfied_24 else -> R.drawable.baseline_sentiment_dissatisfied_24 } Scaffold( topBar = { TopAppBar( title = { Text("비만도 측정기") }, navigationIcon = { Icon( imageVector = Icons.AutoMirrored.Filled.ArrowBack, contentDescription = null, modifier = Modifier.clickable(onClick = onBackClick) ) } ) } ) { Box( modifier = Modifier.padding(it) ) { Column( modifier = Modifier .fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center ) { Text(text, fontSize = 30.sp) Spacer(modifier = Modifier.height(50.dp)) Image( painter = painterResource(id = icon), contentDescription = null, modifier = Modifier.size(100.dp), colorFilter = ColorFilter.tint( color = Color.Black ) ) } } } } fun bmiCalculate( height: Double, weight: Double ): Double { return weight / (height / 100).pow(2.0) } 감사합니다!

  • android
  • kotlin
  • jetpack
twahn 댓글 1 좋아요 0 조회수 109

dataBinding 시 오류

해결됨

[중급편] 친절한 JETPACK 개론 <상> (Android Kotlin)

안녕하세요? dataBinding 강의를 듣고 실습 중 지금의 대목에서 계속 오류가 납니다. 안드로이드 버전 문제인지 어떤지 잘 모르겠습니다. 일단 구글 드라이브에 해당 파일을 올려 보았습니다. https://drive.google.com/file/d/1pVyzoFYj5apFNWuMUjtBqGEtG_p_wEaP/view?usp=sharing 살펴보시고, 말씀 주시면 감사하겠습니다. 해당 오류 메시지의 첫 부분은 다음과 같습니다: Execution failed for task ':app:compileDebugKotlin'. > A failure occurred while executing org.jetbrains.kotlin.compilerRunner.GradleCompilerRunnerWithWorkers$GradleKotlinCompilerWorkAction > Internal compiler error. See log for more details Try: > Run with --info or --debug option to get more log output. > Run with --scan to get full insights. > Get more help at https://help.gradle.org . Exception is: org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:compileDebugKotlin'. at

  • android
  • kotlin
  • jetpack
Keys 댓글 2 좋아요 0 조회수 100

onTabFavorite 콜백 관련 질문

미해결

모던 안드로이드 - Jetpack Compose 입문

안녕하세요, 강의에 구성하신 콜백 메서드 대신 아무 파라미터도 받지 않고 부모에서 정의한 isFavorite을 바꿔주는 형태로 콜백을 구성해도 되는것인지 궁금합니다. class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() setContent { MyApplicationTheme { Scaffold { innerPadding -> Box( modifier = Modifier .padding(innerPadding) .fillMaxSize() ) { var isFavorite by rememberSaveable { mutableStateOf(true) } ImageCard( modifier = Modifier .fillMaxWidth(0.5f) .padding(16.dp), isFavorite ) { isFavorite = !isFavorite } } } } } } } @Composable fun ImageCard( modifier: Modifier = Modifier, isFavorite: Boolean, onTabFavorite: () -> Unit, ) { Card( shape = RoundedCornerShape(8.dp), elevation = CardDefaults.cardElevation(5.dp), ) { Box( modifier = Modifier.height(200.dp) ) { Image( painter = painterResource(R.drawable.moon), contentDescription = "cute", contentScale = ContentScale.Crop, ) Box( modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.TopEnd ) { IconButton( onClick = onTabFavorite, ) { Icon( imageVector = if (isFavorite) Icons.Default.Favorite else Icons.Default.FavoriteBorder, contentDescription = "favorite", tint = Color.White, ) } } } } } 감사합니다!

  • android
  • kotlin
  • jetpack
twahn 댓글 2 좋아요 0 조회수 84

수강기간 연장 문의 입니다.

해결됨

아이비의 안드로이드 드릴

안녕하세요. 수강기간이 내년 1월까지인데 추가 금액을 지불 할 생각도 있는데 연장이 가능할까요?? 몸이 안좋아서 그동안 듣지를 못했습니다. 알려주시면 감사하겠습니다..

  • android
  • kotlin
  • jetpack
열심히살자 댓글 2 좋아요 0 조회수 84

MainActivity 코드가 뭔가요?ㅠ

미해결

[LV2] Jetpack Compose - UI와 애니메이션

Theme이랑 MainActivity 코드가 없이 바로 시작 되어서 Ex1_1 파일을 못 만들겠어요ㅠㅠ 혹시 다른 초급 강의에 나와있을까요?..

  • android
  • jetpack
  • Android Compose
댓글 3 좋아요 0 조회수 90

suspend fun 과 viewModelScope.launch 에 대해 궁금합니다.

미해결

[중급편] 친절한 JETPACK 개론 <하> (Android Kotlin)

강의를 보니 viewModel 에서 Room 에 CRUD 를 하기 위해서는 비동기 처리를 해야 하고, 1. 이를 위해 viewModelScope.launch 를 사용하는 것 같은데 맞을까요? viewModel 의 CRUD 함수를 suspend fun 으로 만들면 viewModelScope.launch 를 안써도 되는 건가요?

  • android
  • kotlin
  • jetpack
서광태 댓글 2 좋아요 0 조회수 139

livedata가 왜 필요한 건지 궁금합니다

미해결

모던 안드로이드 - Jetpack Compose 입문

retrofit 관련 학습 중인데요. livedata/mutablelivedata 가 나오는데 viewmodel과 무슨 차이가 있는지 궁금해서 여쭤 봅니다. viewmodel은 변수를 쉽게 지정해서 사용하는 클래스 정도로 이해하고 있는데, livedata는 왜 필요한 건지를 잘 모르겠어서요 livedata는 수명주기를 인식한다는 말과 관찰 가능하다는 말이 무슨 말인지요?

  • android
  • kotlin
  • jetpack
김창완 댓글 3 좋아요 0 조회수 157

Retrfit 에러

미해결

[중급편] 친절한 JETPACK 개론 <상> (Android Kotlin)

개발자님 혹시 제가 android 2024.2.2 버전을 사용하고 있는데 이 버전에서는 dependencies부분에 retrofit2을 어떻게 추가해야하는지 알 수 있을까요? 아래와 같이 두 방법으로 시도해봤는데 추가가 안되는 거 같아 질문드립니다. implementation("com.squareup.retrofit2:retrofit:2.9.0") implementation("com.squareup.retrofit2:converter-gson:2.9.0") implementation(libs.retrofit) implementation(libs.converter.gson)

  • android
  • kotlin
  • jetpack
염수환 댓글 2 좋아요 0 조회수 167

github 저장소 질문 드립니다 !

해결됨

아이비의 안드로이드 드릴

private 저장소 멤버로 초대했다고 공지가 떴는데, 404 페이지가 뜹니다 ㅠ. 디스코드도 별도의 연락이 오지 않았습니다.

  • android
  • kotlin
  • jetpack
도비 댓글 3 좋아요 0 조회수 173

메인액티비티의 내용이 강의와 다른 것 같습니다.

해결됨

[LV1] Jetpack Compose - UI 연습하기

프로젝트를 만들 때 사진의 Empty Activity를 통해 만들었는데 강의에 있는 내용과 메인 액티비티의 내용이 다른 것 같습니다. 현재 최신의 안드로이드 스튜디오를 사용 중인데 이것 때문에 그런 것인지 그새 바뀐 내용들이 있는 건지 궁금합니다.

  • android
  • kotlin
  • jetpack
wuhvv 댓글 2 좋아요 0 조회수 190

TextField에서 Cursor의 두께를 조절하는 방법이 있을까요?

미해결

[LV1] Jetpack Compose - UI 연습하기

안녕하세요 TextField 커스텀 관련하여 여러 기능을 살펴보고 있는데요. 구글에서 찾아봐도 Cursor의 두께를 설정하는 프로퍼티를 찾지 못하여서 질문드립니다. Cursor를 커스텀하는 방법이 있나요? 두께를 줄이거나 높이를 낮추는 등의 커스텀을 진행하고 싶습니다. 감사합니다.

  • android
  • kotlin
  • jetpack
godgod153 댓글 2 좋아요 0 조회수 250

네비게이션

해결됨

아이비의 안드로이드 드릴

home_graph.xml의 시작점 app :startDestination ="@id/navigation_home" app :startDestination ="@id/navigation_다른 activity" 이렇게 나눠서 하나는 home activity의 FragmentContainerView 에서 상용하고 다른 하나는 detail activity의 FragmentContainerView에서 사용할 수 있나요?

  • android
  • kotlin
  • jetpack
Daehee Park 댓글 1 좋아요 0 조회수 139

TextField에서 테두리 제거하는 방법이 궁금합니다.

해결됨

[LV1] Jetpack Compose - UI 연습하기

안녕하세요. CoupangEx-3 강의에서 검색 기능을 위해 TextField를 만들었는데, TextField 주위에 있는 회색의 테두리를 어떻게 제거할 수 있는지 궁금합니다.... 인터넷 검색을 해도 동작하지 않거나, 언더라인을 지우는 코드들만 나와서 자료를 못 찾겠습니다. 감사합니다.

  • android
  • kotlin
  • jetpack
godgod153 댓글 2 좋아요 0 조회수 260

깃허브에 있는 MemoryTodoRepository 는 룸을 사용하는게 아닌 메모리에 저장, 수정, 삭제 하는건가요?

미해결

모던 안드로이드 - Jetpack Compose 입문

Room처럼 내부저장소에 저장하는 것이 맞다면, Room을 사용 하지 않는 방법인데 작동되는 건 아예 똑같은 건가요? 아니면 저장되는 곳이 다르다거나 저장방식은 다른데 같은 역할로써 쓰일 수 있는건가요?

  • android
  • kotlin
  • jetpack
김영진 댓글 1 좋아요 0 조회수 205

영상 1분쯤에서 MainActivity에서 viewModel이 저는 안되고 그래들 문제인거 같은데 해결 방법을 모르겠습니다.

미해결

모던 안드로이드 - Jetpack Compose 입문

깃허브에 있는걸 복붙하면 viewModel 부분에서 맨 아래와 같이 오류가 발생해서 맨 위에있는건 https://developer.android.com/codelabs/basic-android-kotlin-training-viewmodel?hl=ko#3 이 링크에서 implementation 하라고 하는걸 넣은 것이고 가운데는 첫번째를 2번째와 같이 변경하라는 추천해서 변경된 내용을 넣은겁니다. 저기서 compose로 끝나는게 그래들이 안되서 MainActivity에서의 viewModel도 영상과 달리 아래처럼만 되어 있는데 해결방법을 전혀 모르겠습니다.

  • android
  • kotlin
  • jetpack
댓글 1 좋아요 0 조회수 226

전자액자에서 영상과 깃허브의 내용이 달라서 영상을 다보고 깃허브 내용으로 돌려봤는데 권한요청부터가 안됩니다.

해결됨

모던 안드로이드 - Jetpack Compose 입문

에뮬레이터에서는 정상 작동을 하는데 제 핸드폰으로 돌리면 권한요청에서부터 안됩니다. SDK는 아래와 같이 되어있고 제 핸드폰은 버전 14인데 이게 문제일까요? namespace = "com.example.photoframe" compileSdk = 34 defaultConfig { applicationId = "com.example.photoframe" minSdk = 28 targetSdk = 34 versionCode = 1 versionName = "1.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { useSupportLibrary = true } }

  • android
  • kotlin
  • jetpack
김영진 댓글 2 좋아요 0 조회수 217

Navigation수업에서 string대신 bitmap을 인자로 넘겨주는 방법?

미해결

모던 안드로이드 - Jetpack Compose 입문

네비게이션 수업도중 궁금한 점이 있어서 질문드립니다. ThirdScreen으로 Bitmap데이터를 인자로 넘기고 싶습니다. 어떻게 해야 할지 모르겠습니다. 예를들어, 카메라 캡쳐해서 다음 스크린으로 캡쳐한 사진을 보내서 이미지를 보여주고 싶을 때, 어떻게 해야 하나요?

  • android
  • kotlin
  • jetpack
김창완 댓글 1 좋아요 0 조회수 196

TodoList - 04에서 recentlyDeleteTodo가 null일 경우 처리 방법 문의

미해결

모던 안드로이드 - Jetpack Compose 입문

개인적으로 변수가 null일 경우 변수?.let { } 이렇게 사용해 왔는데요. 강의에서는 viewModelScope.launch { todoRepository.addTodo(recentlyDeleteTodo ?: return@launch) } 이렇게 사용 하셨는데요. 해당 부분만 보면 뭐가 더 좋다 이럴게 없어 보이기는 하는데요. 혹시 특정한 상황에서 ?: return 으로 하는 것이 필요한(or 더 좋은) 경우가 있을까요?

  • android
  • kotlin
  • jetpack
makin 댓글 1 좋아요 0 조회수 186

인기 태그

인프런 TOP Writers

주간 인기글