kotlin 12

Group(selectedGroupId = null Vs -1)

selectedGroupId 변수는 현재 선택된 그룹을 나타내는데 사용됩니다. 이 변수의 값이 null인 경우 선택된 그룹이 없음을 나타내는 것이 일반적입니다.-1을 사용하는 것은 특정한 상황에서 유효한 그룹 ID가 없음을 나타내는 방법일 수 있지만, 이는 코드를 읽는 사람에게 혼란을 줄 수 있습니다.   따라서, null을 사용하여 "선택된 그룹이 없음"을 나타내는 것이 더 명확하고 일반적인 방법입니다. 이렇게 하면 selectedGroupId 변수의 타입을 nullable Group?으로 선언할 수 있으며, 이 변수가 null인지 아닌지를 확인함으로써 선택된 그룹의 존재 여부를 쉽게 판단할 수 있습니다.

Kotlin by VS .value collectAsStateWithLifecycle

val groupsUiState by viewModel.groupsUiState.collectAsStateWithLifecycle() val groupsUiState = viewModel.groupsUiState.collectAsStateWithLifecycle().value 두 코드는 Kotlin의 by 키워드를 사용하는 방식과 직접 .value를 호출하는 방식의 차이를 보여줍니다.   val groupsUiState by viewModel.groupsUiState.collectAsStateWithLifecycle() 이 코드는 Kotlin의 위임 프로퍼티(delegated property)를 사용합니다. by 키워드를 사용하면 groupsUiState의 값은 viewModel.groupsUiState..

MutableStateFlow .update VS .value = 차이점

private val _uiState = MutableStateFlow(UiState.Loading)_uiState.update { when (state) {VS_uiState.value = state 두 방법 모두 MutableStateFlow의 값을 업데이트하는 방법이지만, 사용 상황에 따라 적합한 방법이 다르다._uiState.update { }: 이 방법은 현재 MutableStateFlow의 값에 기반하여 새 값을 계산할 때 유용하다. 이 함수는 현재 값을 인자로 받는 람다 함수를 사용하며, 람다 함수의 반환 값이 새로운 값으로 설정됨.  _uiState.value = state: 이 방법은 새 값이 현재 값에 의존하지 않을 때 사용한다. 이 방법은 단순히 MutableStateFlow의 ..

Inheritance from an interface with '@JvmDefault' members is only allowed with -Xjvm-default option

Inheritance from an interface with '@JvmDefault' members is only allowed with -Xjvm-default option viewModel 에 param을 추가하였더니 viewModel Factory가 필요하고, 추가 하니 위와 같은 에러가 나왔다~ 버전 충돌 문제인데~ build.gradle.app 에 kotlinOptions { jvmTarget = '1.8' freeCompilerArgs += [ '-Xjvm-default=enable' ] } 또는 tasks.withType(KotlinCompile).configureEach { kotlinOptions { freeCompilerArgs += [ "-Xjvm-default=all", ] } }..

smart cast to is impossible because is a mutable property that could have been changed by this time

변경될 수 있는(mutable/var) 타입을 캐스팅 할 경우 문제가 생긴다. 이 경우에는 val 불변 타입으로 새로운 변수에 할당 한 뒤에 캐스팅을 해야 한다. private val plantDetailViewModel: PlantDetailViewModel by viewModels { InjectorUtils.providePlantDetailViewModelFactory(requireActivity(), args.plantId) } val binding = DataBindingUtil.inflate( inflater, R.layout.fragment_plant_detail, container, false ).apply { viewModel = plantDetailViewModel //error bea..

[MVVM] LiveData와 ViewModel Observer로 연결

Repository의 Data가 변경 되었을 때 UI에 알리기 위해서는 ViewModel이 관찰을 하고 있어야 한다. UI(V)는 보통 onCreate()에서 VM을 생성하고, VM은 Repository를 생성한 뒤 M과 Dao를 통해 연결 되는데, 이 Dao를 LiveData로 구성하면 ViewModel이 지켜 볼 수(obsever) 있게 된다. 연결(MVVM) onCreate/onCreateView 실행이 되면서 viewModel 생성 작업과 이후 연결 작업이 실행 된다. Fragment.kt private val plantDetailViewModel: PlantDetailViewModel by viewModels { InjectorUtils.providePlantDetailViewModelFacto..

[Sunflower 디비보기] 데이터 바인딩과 HtmlCompat.fromhtml

TextView 에 Html 형식으로 글자를 바꿀 수 있다. 데이터 바인딩을 통해 바인딩 어뎁터(BindingAdapter)로 연결하면 간단하게 구현 할 수 있다. @BindingAdapter("renderHtml") fun bindRenderHtml(view: TextView, description: String?) { if (description != null) { view.text = HtmlCompat.fromHtml(description, FROM_HTML_MODE_COMPACT) view.movementMethod = LinkMovementMethod.getInstance() } else { view.text = "" } } 입력) plant.description = 동해물과 백두산이(from..