일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
- studio
- 다트
- 깃헙
- DI
- viewpager
- image
- 안드로이드
- ADB
- 웹뷰
- coroutine
- 의존성주입
- 안드로이드 스튜디오
- 안스
- MVVM
- 에러
- build
- GIT
- 안드로이드스튜디오
- dart
- 레트로핏
- Gradle
- Github
- 스튜디오
- RecyclerView
- WebView
- Kotlin
- Retrofit
- 코틀린
- Android
- error
- Today
- Total
목록전체 글 (158)
코딩하는 일용직 노동자
1. 데이터 스트림 방식: MutableStateFlow: 단일 구독자를 위한 유니캐스트 데이터 스트림입니다. 최신 값만 유지하며, 새 값이 방출되면 이전 값은 덮어쓰됩니다. MutableSharedFlow: 여러 구독자를 위한 멀티캐스트 데이터 스트림입니다. 모든 구독자는 최신 값을 받으며, 버퍼링을 통해 이전 값도 받을 수 있습니다. Channel: 여러 구독자를 위한 멀티캐스트 데이터 스트림입니다. 버퍼링을 통해 데이터를 저장하며, 여러 구독자가 동시에 데이터를 읽고 쓸 수 있습니다. 2. 구독 방식: MutableStateFlow: collect 함수를 사용하여 구독합니다. MutableSharedFlow: collect 또는 subscription 함수를 사용하여 구독합니다. Channel: r..
Coroutine Operator(코루틴 연산자)는 데이터 스트림을 처리하고 변환하는 데 사용되는 함수입니다. 크게 두 가지 종류로 나눌 수 있습니다. 1. 중간 연산자: 데이터 스트림을 변환하거나 필터링하는 데 사용됩니다. 여러 개의 연산자를 체인 방식으로 연결하여 사용할 수 있습니다. 대표적인 연산자로는 map, filter, take, zip 등이 있습니다. map: 각 데이터를 변환하여 새로운 데이터 스트림을 생성합니다. filter: 특정 조건에 맞는 데이터만 선택하여 새로운 데이터 스트림을 생성합니다. take: 지정된 개수의 데이터만 가져옵니다. zip: 두 개의 데이터 스트림을 결합하여 새로운 데이터 스트림을 생성합니다. buffer: 데이터 스트림을 버퍼링하여 처리 속도를 향상시킵니다. ..
액티비티나 프래그먼트 내에서 ViewModel을 사용하려면 ViewModelProvider를 이용해 ViewModel을 생성해 사용할 수 있습니다. ViewModel을 생성할때는 파라메터가 있을때와 없을때의 생성방법이 차이가 있습니다. 파라메터가 없는 ViewModel은 아래처럼 생성이 가능합니다. val viewModel: MainActivityViewModel by lazy { ViewModelProvider(this)[MainActivityViewModel::class.java] } 하지만 MainActivityViewModel의 생성자에 파라메터가 있다면 위 방법으로 객체생성이 안됩니다. 테스트를 위해 Int형의 파라메터를 받는 MainActivityViewModel 클래스를 만들어보겠습니다. i..
기본적인 Compose로 구현하는 화면은 상단에 statusBar가 있고 아래에 navigationBar가 있는 형태입니다. modifier에 statusBarsPadding() navigationBarsPadding()를 추가해서 상단과 하단의 영역을 제외한 나머지 영역을 사용하도록 합니다. 하지만 요즘은 이 영역을 모두 사용해서 더 이쁘게 앱을 만드는 추세입니다. Jetpack Compose에서 전체화면을 사용해 컨텐츠를 표시하는 방법을 알아보겠습니다. 코드를 통해 확인해봅시다. @SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") @Composable fun MyScreen() { Scaffold { Column( modifier = Modifier ..
Activity 가 아닌 Class나 ViewModel class 에 Activity의 라이프사이클을 연결해서 onCreate(), onResume(), onPause(), onStop() 등의 상태변화를 감지하고 처리하는 방법을 알아보겠습니다. 이번 예제에서는 ViewModel 에 연결해보겠습니다. 1. app레벨의 gradle에 아래의 라이브러리들을 추가해줍니다. 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 'androi..
app 레벨의 build.gradle 파일에 아래 내용을 추가해주면 됩니다. def getDate() { return new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) } def buildDate = '\"' + getDate() + '\"' def appName = "APP_NAME" android { ... defaultConfig { ... setProperty("archivesBaseName","${appName}-v${versionName}(${versionCode})-${buildDate}") } ... }
Github 에서 2년전 자료를 클론받았다. gradle 파일에서 dependencies의 라이브러리 버전들을 최신으로 올려준 후 빌드해보니 아래와 같은 에러메세지가 보이면서 빌드가 되지 않았다. Can't determine type for tag '?attr/shapeAppearanceCornerSmall' 구글링을 해보니 최신 라이브러리에서 빌드시 에러가 발생하고 있어서 버전을 좀 낮춰서 해보라는 답변이 있었다. implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.9.0' 을 아래처럼 고쳤다. implementation 'androidx.appcompat:appc..
맥북을 포맷 후 재설치 해서 개발환경을 깨끗하게 새로 셋팅했습니다. 소스트리를 이용해 구글 클라우드에 있던 기존 프로젝트를 새로 pull 하려고 하니 아래와 같은 에러가 표시됩니다. permission denied (publickey) ssh key가 등록안되있어서 발생하는 에러입니다. 구글 클라우드에서 ssh key 를 등록해봅시다. 우선 터미널에서 아래와 같이 명령어를 입력합니다. ssh-keygen -t rsa -C "계정이메일" 패스워드를 입력해서 만들 수 있지만 엔터키를 누르면 패스워드를 만들지 않고 ssh key 가 생성됩니다. 만드셔도 되고, 안만드셔도 됩니다. 전 만들지 않고 엔터키를 계속 입력했습니다. 자 이제 아래 명령어를 입력하면 생성된 ssh key 가 표시됩니다. cat ~/.ss..
안드로이드 앱을 설치하거나 작업할때 adb 명령어를 사용할 경우가 많습니다. 맥북을 새로 구입했거나 초기화를 한 후 안드로이드 개발툴을 설치하고 adb 명령어를 입력하니 zsh: command not found: adb 이렇게 표시되었습니다. 안드로이드 환경변수가 제대로 설정되지 않은것입니다. adb 명령어를 사용할 수 있도록 안드로이드 sdk 경로 설정이 필요합니다. 당황하지 않고 아래처럼 입력해줍니다. zshrc에서 안드로이드 adb명령어가 안될 때의 예시입니다. 만약 bash인 경우 zshrc -> bash_profile 로 변경하시면 됩니다. 1. 우선 터미널에서 vi ~/.zshrc 입력합니다. 2. vi 모드에서 아래 내용을 입력합니다. export ANDROID_HOME=/Users/사용자명..
안드로이드 의존성주입에 Koin을 사용할때 Activity 와 그 아래 속한 하나 이상의 Fragment 에서 같은 ViewModel 을 사용할 필요가 있는 경우가 있습니다. 기존에는 by sharedViewModel() 을 이용하면 됐는데 이것이 deprecated 되었습니다. 이제는 by activityViewModel() 을 이용하도록 변경되었습니다. val weatherAppModule = module { // WeatherViewModel declaration for Weather View components viewModel { WeatherViewModel(get(), get()) } } class WeatherActivity : AppCompatActivity() { /* * Declare..