묻고 답해요
131만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[중급편] 코인 가격 모니터링 앱 제작 (Android Kotlin)
풀 소스 코드는 없나요!?
풀 소스 코드는 없나요!?
-
미해결모던 안드로이드 - Jetpack Compose 입문
나만의 웹브라우져 02 코드실행시 에뮬레이터에 따라
Galaxy Nexus API 34 일 경우는 정상적으로 실행되나Pixel 7 Pro APi 34 일 경우는 실행중에 에뮬레이터가 사라집니다 class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { HomeScreen() } } } @OptIn(ExperimentalMaterial3Api::class) @Composable fun HomeScreen() { Scaffold ( topBar = { TopAppBar( title = { Text("")}, actions = { IconButton(onClick = { }){ Icon( imageVector = Icons.Default.ArrowBack, contentDescription = "back", tint = Color.White ) } IconButton(onClick = { }){ Icon( imageVector = Icons.Default.ArrowForward, contentDescription = "forward", tint = Color.White ) } } ) } ) { paddingValues -> Column( modifier = Modifier .padding(16.dp) .fillMaxSize() ) { OutlinedTextField( value = "", onValueChange = {}, label = { Text("https://")}, modifier = Modifier .padding(paddingValues) .fillMaxWidth(), keyboardOptions = KeyboardOptions(imeAction = ImeAction.Search), keyboardActions = KeyboardActions(onSearch = {}), ) Spacer(modifier = Modifier.height(16.dp)) MyWebView() } } } @Composable fun MyWebView() { AndroidView( modifier = Modifier.fillMaxSize(), factory = { WebView(it).apply { settings.javaScriptEnabled = true webViewClient = WebViewClient() loadUrl("https://google.com") } }, update = {}, ) }
-
미해결프리다(Frida)를 이용한 안드로이드 앱 모의해킹
강의 기본 명령어 활용에서
프리다 최신 버전 16.1.8 인데 현재 server 가 없어16.1.7로 아나콘다에서 다운받고x86 32bit로 변경하고 reslse 프리다 서버도 16.1.7로 맞추고frida-ps -U 라는 명령어 치면 녹스랑 연결이 된거 확인하느데 frida -U com.android.chrome 가 되지않습니다.최신버전으로 동영상 편집해주시던가 19년거여서 버전 문제 날거 같아 걱정햇는 데 그 우려가 벌써 나와서 ..이거 어떻게 해야합니가 ?chown 해결했는데 여기서 문제가 발생했습니다. 여기서는 루프백 주소가 접속이 안되고 없는데nox 에는 다운 받은내용은 있습니다.. 웃긴게 왜 크롬 연결이 되느지 .. 이거 제대로 연결 된건가요?firida-ps -D 명령어 오류인줄 알고 다시 해보지만 안되는데 이게 정상 설정 된건지 알고 싶습니다
-
미해결코딩의민족 앱 제작 (Android kotlin)
View Binding으로 GridView를 구현하고 싶습니다.(섹션0-GridView 강의 문의)
안녕하세요. 섹션0의 Gridview를 실습 문의드립니다. 질문내용 : 'kotlin-android-extensions' 에서 View Binding으로 교체하고 싶습니다. 상황설명 : (1) 실습후 빌드하면 'kotlin-android-extensions' 이 종료되었다고 합니다. 이로 인해 실습을 따라하면 빌드 에러가 발생되고 있습니다.(참고사진-1) (2) 참고사진-1에서 빌드 콘솔에 나오는 가이드 개발자 사이트의 설명에 따라 View Binding으로 코드를 갱신하고 있습니다만 GridViewAdapter.kt등에 어떻게 적용해야 할지 감을 못 잡고 헤메고 있습니다.[참고사진-1.build시 에러 장면][참고사진-1.build의 콘솔 내용]The 'kotlin-android-extensions' Gradle plugin is no longer supported. Please use this migration guide (https://goo.gle/kotlin-android-extensions-deprecation) to start working with View Binding (https://developer.android.com/topic/libraries/view-binding) and the 'kotlin-parcelize' plugin. 조언 등을 부탁드립니다. 감사합니다. 부록.해당 실습예제코드(gitHub)https://github.com/BoSeongGim/practice_coding/tree/main/andorid(mobile)/clone_cording(cording_peoples)
-
미해결윤재성의 자바 기반 안드로이드 앱개발 Part 1 - UI Programming
상태 변화 리스너 중 switch-case문 오류 문제
강의 22분 35초 경 switch-case 문을 통해 체크박스의 id로 분기를 하려고 할 때 // id로 분기함 switch (checkboxId) { case R.id.checkBox: break;case 문의 R.id.checkBox부분에서 "Constant expression required" 에러가 발생합니다. 구글링을 해보니 switch-case 문의 상수가 final로 선언되지 않아 발생하는 문제라고 하는데 어떻게 해결할 수 있을까요?
-
미해결윤재성의 자바 기반 안드로이드 앱개발 Part 1 - UI Programming
20강 android view.View 자동 임포트 관련 질문입니다.
강의 18분쯤에 Button의 Click 리스너 클래스를 생성 중 class ButtonClickListener1 implements OnClick까지 입력 후 자동 임포트를통해 android view.View를 임포트하라고 하셨는데 제 안드로이드 스튜디오에서는android.content.DialogInterface 만 자동 임포트 창에 떠있어서 질문드립니다.
-
미해결[중급편] 친절한 JETPACK 개론 <상> (Android Kotlin)
에러
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.DataBinding 과 data class 강의 듣고잇는중입니다xml에서 버튼에 myClick을 연결시킨 부분부터 애뮬레이터에서 버튼을 누르면 애플리케이션이 자동종료됩니다.코드를 똑같이 따라쳣는데 왜 이렇게 된건지모르겟습니다.에러내용입니다(코드내용 똑같다고 보면 될거같습니다.) <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools"> <data> <variable name="user" type="com.actual.jetpack_ex_databinding2.Person" /> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity"> <TextView android:id="@+id/test" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text= "@{user.name}" android:textSize="50sp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text= "@{Integer.toString(user.age)}" android:textSize="50sp" /> <TextView android:textSize="100dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.age > 30 ? `나이 많음` : `나이 적음`}" /> <Button android:text = "btn" android:onClick="myClick" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout> </layout> package com.actual.jetpack_ex_databinding2 import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.util.Log import android.view.View import androidx.databinding.DataBindingUtil import com.actual.jetpack_ex_databinding2.databinding.ActivityMainBinding class MainActivity : AppCompatActivity() { private lateinit var binding : ActivityMainBinding var testCount = 20 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = DataBindingUtil.setContentView(this, R.layout.activity_main ) // binding.test.text= "바뀐 텍스트" val person = Person("개복치", 20) binding.user= person fun myClick(view : View) { Log.d("MainActivity", "onClick") testCount++ val person = Person("개복치", testCount) binding.user = person } } } package com.actual.jetpack_ex_databinding2 data class Person ( val name : String, val age : Int )FATAL EXCEPTION: main Process: com.actual.jetpack_ex_databinding2, PID: 7731 java.lang.IllegalStateException: Could not find method myClick(View) in a parent or ancestor Context for android:onClick attribute defined on view class com.google.android.material.button.MaterialButton at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.resolveMethod(AppCompatViewInflater.java:506) at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:464) at android.view.View.performClick(View.java:7659) at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1213) at android.view.View.performClickInternal(View.java:7636) at android.view.View.-$$Nest$mperformClickInternal(Unknown Source:0) at android.view.View$PerformClick.run(View.java:30156) at android.os.Handler.handleCallback(Handler.java:958) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loopOnce(Looper.java:205) at android.os.Looper.loop(Looper.java:294) at android.app.ActivityThread.main(ActivityThread.java:8177) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971) 그전까지는 잘 되는거로 보아 onClick="myClick" 부분이 문제인것같은데 잘 못찾겟습니다.
-
해결됨[초중급편] 안드로이드 데이팅 앱 만들기(Android Kotlin)
초급용 미리보기 영상을 보며 따라하고 있습니다.
안녕하세요!1) 초급용 추천받아서 미리보기로 영상을 따라하고 있는데 영상과 다르게 'build configuration language'가 계속 뜨고2) 'android studio' 다운 받을 때 저는 'android studio giraffe'로 다운을 받았는데 이건 버전을 나누기 위해 다른 게 맞나요?
-
해결됨[초중급편] 안드로이드 데이팅 앱 만들기(Android Kotlin)
만든 후 activity_main.xml이 없습니다. MainActivity.kt의 로고도 이상합니다.
안녕하세요!위 화면에서 finish후 나오는 화면입니다.
-
미해결[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
람다 함수 중복 문제가 발생했는대 해결을 못하고있습니다.
명언 앱 마지막 부분에서 컴파일을 실행하면 발생하는 오류가 있습니다. Type com.cho.goodwards.MainActivity$$ExternalSyntheticLambda0 is defined multiple times: /Users/mac/Desktop/개인공부/Kotlin_ex/ex.5/app/build/intermediates/project_dex_archive/debug/out/com/cho/goodwards/MainActivity 2.dex, /Users/mac/Desktop/개인공부/Kotlin_ex/ex.5/app/build/intermediates/project_dex_archive/debug/out/com/cho/goodwards/MainActivity.dex 예제 파일을 받아 복붙해도 똑같이 오류가 발생합니다. gpt 에 질문 하니 binding = DataBindingUtil.setContentView(this, R.layout.activity_main) binding.showAllSentenceBtn.setOnClickListener { val intent = Intent(this, SentenceActivity::class.java) startActivity(intent) } binding.goodWordTextArea.setText(sentenceList.random()) } 이부분에서 문제가 생긴다고 하는대 안드로이드 처음이라 오류 찾는게 좀 힘듭니다. 구글링에서도 그래들 빌드 설정을 바꿔라는대 제가 잘못 수정했는지 오류가 여전히 걸리더군요
-
미해결[초중급편] 안드로이드 데이팅 앱 만들기(Android Kotlin)
매칭리스트를 눌러도 아무 반응이 없어요
계정 여러개 생성하여 서로 매칭을 시켜 알람까지 갔는데 MY MATCHING LIST를 눌러도 아무 반응이 없네요 어디가 문제인지 봐주실 수 있을까요?전체코드 깃허브 주소 -https://github.com/alsxm4625/sogating4/commit/e1307ce30381e77d678b715b3227f2e1a00d9a09
-
미해결모던 안드로이드 - Jetpack Compose 입문
나만의 웹브라우져 01 코딩 후 실행하면 아래와 같은 오류가 뜨네요
We recommend using a newer Android Gradle plugin to use compileSdk = 34 This Android Gradle plugin (8.0.2) was tested up to compileSdk = 33. You are strongly encouraged to update your project to use a newer Android Gradle plugin that has been tested with compileSdk = 34. If you are already using the latest version of the Android Gradle plugin, you may need to wait until a newer version with support for compileSdk = 34 is available. To suppress this warning, add/update android.suppressUnsupportedCompileSdk=34 to this project's gradle.properties. 안드로이드 스튜디오버젼이 강사님과 달라 아직 헤메고 있습니다MainActivity.ktimport android.os.Bundle import android.webkit.WebView import androidx.activity.ComponentActivity import androidx.activity.compose.setContent 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.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ArrowBack import androidx.compose.material.icons.filled.ArrowForward import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.IconButton 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.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.unit.dp import androidx.compose.ui.viewinterop.AndroidView class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { HomeScreen() } } } @OptIn(ExperimentalMaterial3Api::class) @Composable fun HomeScreen() { Scaffold ( topBar = { TopAppBar( title = { Text("")}, actions = { IconButton(onClick = { }){ Icon( imageVector = Icons.Default.ArrowBack, contentDescription = "back", tint = Color.White ) } IconButton(onClick = { }){ Icon( imageVector = Icons.Default.ArrowForward, contentDescription = "forward", tint = Color.White ) } } ) } ) { paddingValues -> OutlinedTextField( value = "", onValueChange = {}, label = { Text("https://")}, modifier = Modifier .padding(paddingValues) .fillMaxWidth(), keyboardOptions = KeyboardOptions(imeAction = ImeAction.Search), keyboardActions = KeyboardActions(onSearch = {}), ) Spacer(modifier = Modifier.height(16.dp)) MyWebView() } } @Composable fun MyWebView() { AndroidView( modifier = Modifier.fillMaxSize(), factory = { WebView(it).apply { loadUrl("https://google.com") } }, update = {}, ) } build.gradle(Project)plugins { id 'com.android.application' version '8.0.2' apply false id 'com.android.library' version '8.0.2' apply false id 'org.jetbrains.kotlin.android' version '1.7.20' apply false } build.gradle(Module :app)plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' } android { namespace 'com.dongguntech.compose_mywebbrowser' compileSdk 34 defaultConfig { applicationId "com.dongguntech.compose_mywebbrowser" minSdk 26 targetSdk 34 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { useSupportLibrary true } } buildTypes { release { minifyEnabled 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.10' } buildFeatures { compose true } composeOptions { kotlinCompilerExtensionVersion '1.4.3' } packagingOptions { resources { excludes += '/META-INF/{AL2.0,LGPL2.1}' } } } dependencies { var lifecycle_version = "2.5.1" // 2.6.2 버젼은 오류가 남 var arch_version = "2.1.0" // ViewModel implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version") // ViewModel utilities for Compose implementation("androidx.lifecycle:lifecycle-viewmodel-compose:$lifecycle_version") // LiveData implementation("androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version") // Lifecycles only (without ViewModel or LiveData) implementation("androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version") // Saved state module for ViewModel implementation("androidx.lifecycle:lifecycle-viewmodel-savedstate:$lifecycle_version") // alternately - if using Java8, use the following instead of lifecycle-compiler implementation("androidx.lifecycle:lifecycle-common-java8:$lifecycle_version") // optional - helpers for implementing LifecycleOwner in a Service implementation("androidx.lifecycle:lifecycle-service:$lifecycle_version") // optional - ProcessLifecycleOwner provides a lifecycle for the whole application process implementation("androidx.lifecycle:lifecycle-process:$lifecycle_version") // optional - ReactiveStreams support for LiveData implementation("androidx.lifecycle:lifecycle-reactivestreams-ktx:$lifecycle_version") // optional - Test helpers for LiveData testImplementation("androidx.arch.core:core-testing:2.2.0:78") // optional - Test helpers for Lifecycle runtime testImplementation ("androidx.lifecycle:lifecycle-runtime-testing:$lifecycle_version") implementation "androidx.compose.animation:animation:1.5.4" implementation "androidx.compose.foundation:foundation:1.5.4" implementation "androidx.compose.material:material:1.5.4" implementation "androidx.compose.material3:material3:1.1.2" implementation "androidx.compose.runtime:runtime:1.5.4" implementation "androidx.compose.ui:ui:1.5.4" implementation 'androidx.compose.ui:ui-graphics' implementation 'androidx.compose.ui:ui-tooling-preview' implementation 'androidx.core:core-ktx:1.12.0' implementation platform('org.jetbrains.kotlin:kotlin-bom:1.8.0') implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.2' implementation 'androidx.activity:activity-compose:1.8.1' implementation "androidx.wear.compose:compose-foundation:1.2.1" implementation "androidx.wear.compose:compose-material:1.2.1" implementation "androidx.wear.compose:compose-navigation:1.2.1" debugImplementation 'androidx.compose.ui:ui-tooling' debugImplementation 'androidx.compose.ui:ui-test-manifest' implementation platform('androidx.compose:compose-bom:2022.10.00') 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:2022.10.00') androidTestImplementation 'androidx.compose.ui:ui-test-junit4' } 참고로 제가 사용중인 안드로이드 스튜디오버젼은Android Studio Flamingo | 2022.2.1 Patch 2입니다
-
미해결[LV1] Jetpack Compose - UI 연습하기
이력서앱의 화면이 강사님과는 너무 달라서 어찌 ???
화면이 강의내용과 너무달라 강사님의 강의화면과 같이 고치려면 아직 초보라서 ㅠㅠㅠ 저의 코드는 아래와 같습니다import android.content.Intent import android.net.Uri import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Card import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.CircleShape import androidx.compose.material3.Button import androidx.compose.material3.CardDefaults import androidx.compose.material3.Divider import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { MyResume() } } } @OptIn(ExperimentalMaterial3Api::class) @Composable fun MyResume() { Scaffold( topBar = { TopAppBar( title = { Text("이력서만들기") }, ) } ) { paddingValues -> MyResumeContent(paddingValues) } } @Composable fun MyResumeContent(paddingValues: PaddingValues) { var context = LocalContext.current Card( modifier = Modifier .padding(20.dp) .fillMaxWidth(), colors = CardDefaults.cardColors(Color.LightGray), elevation = CardDefaults.cardElevation( defaultElevation = 10.dp // 테두리음영의 농도 ), shape = RoundedCornerShape(30.dp) // 둥근모서리(5.dp)를 줌 ) { Column( modifier = Modifier .fillMaxSize() .padding(20.dp), ){ Image( painter = painterResource(id = R.drawable.mypic), contentDescription = "내사진", modifier = Modifier .size(150.dp) .clip(CircleShape) .align(Alignment.CenterHorizontally) ) Spacer(Modifier.height(20.dp)) Text( "자기소개", fontSize = 23.sp, modifier = Modifier .align(Alignment.CenterHorizontally), ) Spacer(Modifier.height(10.dp)) Text( "안녕하세요 저는 이동검입니다. 언제나 긍정적으로 살기를 노력하고 이웃과 사회와 인류를 이롭게하는 삶이 되기를 원합니다 ", fontSize = 19.sp, modifier = Modifier .align(Alignment.CenterHorizontally), ) Spacer(Modifier.height(10.dp)) Text( "하지만 떄떄로 먹고사는 문제에 부딫쳐 초심을 잃어버릴 때도 있었지요 ... ", color = Color.Red, fontSize = 17.sp, modifier = Modifier .align(Alignment.CenterHorizontally), ) Spacer(Modifier.height(10.dp)) Divider( // 줄간격내에 선긋기 thickness = 1.dp, color = Color.Gray ) Spacer(Modifier.height(10.dp)) Text( "핸드폰번호 : 010 - 1234 - 5678", fontSize = 17.sp, modifier = Modifier .padding(20.dp) ) Text( "이메일 : abc@google.com", fontSize = 17.sp, modifier = Modifier .padding(20.dp) ) Spacer(Modifier.height(10.dp)) Button( onClick = { var intent = Intent(Intent.ACTION_DIAL, Uri.parse("tel: 01012345678")) context.startActivity(intent) }, modifier = Modifier.fillMaxSize(), ){ Text("전화걸기") } Button( onClick = { var intent = Intent(Intent.ACTION_SENDTO) .apply { data = Uri.parse("mailto:abc@google.com") } context.startActivity(intent) }, modifier = Modifier.fillMaxSize(), ){ Text("메일보내기") } } } }
-
미해결[2023 코틀린 강의 무료제공] 기초에서 수익 창출까지, 안드로이드 프로그래밍 A-Z
대시보드 설정 마지막 단계 Google Play에 앱 게시
안녕하세요대시보드 설정 마지막 단계 Google Play에 앱 게시 단계는 현재는 내부 및 비공개 테스트를 필수적으로 거쳐야 진행 가능한 단계인 것이 맞나요?단계별로 따라 오고 있었는데 해당 단계에서 진행이 불가능하여 제가 파악한 내용이 맞는지 확인하고 싶어 질문 드립니다
-
해결됨Flutter로 SNS 앱 만들기
접속중인 사용자의 정보 가져오기 강의 관련 질문
안녕하세요.강의 잘 듣고 있습니다.접속중인 사용자의 정보 가져오기 강의 관련 질문 있습니다.아래와 같이 영상과 같이 코딩했는데 빨간 줄이 지워지지 않습니다.Future<UserModel> 로 함수 정의를 했는데 빨간 줄이 지워지지 않습니다.무슨 문제인지 모르겠습니다. 바쁘신데 질문 읽어주셔서 감사합니다.
-
미해결윤재성의 자바 기반 안드로이드 앱개발 Part 1 - UI Programming
Android x ScrollView 실습 에러
Android resource linking failedco.kr.scrollview.app-mergeDebugResources-30:/layout/activity_main.xml:34: error: '@tools:sample/avatars' is incompatible with attribute src (attr) reference|color.error: failed linking file resources. 에러 해결 방법 부탁합니다.
-
해결됨Flutter로 SNS 앱 만들기
사용자 정보, 게시글 정보를 Model 클래스로 관리 강의 관련 질문
안녕하세요.강의 잘 듣고 있습니다.사용자 정보, 게시글 정보를 Model 클래스로 관리 강의 관련 질문 있습니다.그 전 강의인 firestore에 게시글 정보 저장 강의 까지는 firestore database에 정상적으로 data가 올라갔습니다.하지만, 사용자 정보, 게시글정보를 Model 클래스로 관리 강의에 따라 코드 작성 후firestore database에 data가 올라가지 않습니다.(storage는 잘 작동합니다.)//feed_model.dart // ignore_for_file: public_member_api_docs, sort_constructors_first import 'dart:convert'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:collection/collection.dart'; import 'package:sns_clonecode/models/urser_model.dart'; class FeedModel { final String uid; final String feedId; final String desc; final List<String> imageUrls; final List<String> likes; final int commentCount; final int likeCount; final Timestamp creatAt; final UserModel writer; const FeedModel({ required this.uid, required this.feedId, required this.desc, required this.imageUrls, required this.likes, required this.commentCount, required this.likeCount, required this.creatAt, required this.writer, }); Map<String, dynamic> toMap({ required DocumentReference<Map<String, dynamic>> userDocRef, }) { return { 'uid': this.uid, 'feedId': this.feedId, 'desc': this.desc, 'imageUrls': this.imageUrls, 'likes': this.likes, 'commentCount': this.commentCount, 'likeCount': this.likeCount, 'creatAt': this.creatAt, 'writer': userDocRef, }; } factory FeedModel.fromMap(Map<String, dynamic> map) { return FeedModel( uid: map['uid'], feedId: map['feedId'], desc: map['desc'], imageUrls: List<String>.from((map['imageUrls'])), likes: List<String>.from((map['likes'])), commentCount: map['commentCount'], likeCount: map['likeCount'], creatAt: map['creatAt'], writer: map['writer'], ); } } //user_model.dart // ignore_for_file: public_member_api_docs, sort_constructors_first import 'dart:convert'; class UserModel { final String uid; final String name; final String email; final String? profileImage; final int feedCount; final List<String> followers; final List<String> following; final List<String> likes; const UserModel({ required this.uid, required this.name, required this.email, required this.profileImage, required this.feedCount, required this.followers, required this.following, required this.likes, }); factory UserModel.init() { return UserModel( uid: '', name: '', email: '', profileImage: null, feedCount: 0, followers: [], following: [], likes: [], ); } //usermodle 이 가지고 있는 filed 변수로 가지고 있는 데이터들을 가지고 map 형태 데이터를 만들어 준다. Map<String, dynamic> toMap() { return { 'uid': this.uid, 'name': this.name, 'email': this.email, 'profileImage': this.profileImage, 'feedCount': this.feedCount, 'followers': this.followers, 'following': this.following, 'likes': this.likes, }; } //map 형태 데이터를 인자값을 전달 받아 usermolde 객체를 만들어 준다. factory UserModel.fromMap(Map<String, dynamic> map) { return UserModel( uid: map['uid'], name: map['name'], email: map['email'], profileImage: map['profileImage'], feedCount: map['feedCount'], followers: List<String>.from(map['followers']), following: List<String>.from(map['following']), likes: List<String>.from(map['likes']), ); } } //feed_repository.dart import 'dart:io'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:firebase_storage/firebase_storage.dart'; import 'package:sns_clonecode/models/feed_model.dart'; import 'package:sns_clonecode/models/urser_model.dart'; import 'package:sns_clonecode/utils/logger.dart'; import 'package:uuid/uuid.dart'; class FeedRepository { final FirebaseStorage firebaseStorage; final FirebaseFirestore firebaseFirestore; const FeedRepository({ required this.firebaseFirestore, required this.firebaseStorage, }); Future<void> uploadFeed({ required List<String> files, required String desc, required String uid, //feeds 컬렉션에 저장 //피드 각각이 문서 //이미지는 storage에 직접 저장하고 firestore에 접근할 수 있는 url 문자열로 받을 것이다. //좋아요 수 //이 게시글에 달린 댓글의 수 //게시글을 작성한 날짜 //feeds에서 user의 정보를 바로 가져올 수 있게 reference 타입의 데이터를 저장한다. }) async { //파이어스토어에 데이터 저장하기위해서 //문서 아이디는 겹치지 않는 고유한 값으로 만들어야 한다. //a-z 알파벳 //0~9 숫자 //이 두가지를 조합해서 32글자의 고유한 값을 만들어 준다. //32글자에 - 4개씩 들어가서 36글자가 된다. //고유한 값을 만드는 방법 여러가지 version1 .... //우리는 version1을 사용 (현재 시간을 기준으로 random값을 만들어 준다.) String feedId = Uuid().v1(); //firestore 문서 참조 DocumentReference<Map<String, dynamic>> feedDocRef = firebaseFirestore.collection('feeds').doc(feedId); DocumentReference<Map<String, dynamic>> userDocRef = firebaseFirestore.collection('users').doc(uid); //storage 참조 Reference ref = firebaseStorage.ref().child('feeds').child(feedId); List<String> imageUrls = await Future.wait(files.map((e) async { //문자열 e는 이미지 파일에 접근할 수 있는 경로 String imageId = Uuid().v1(); TaskSnapshot taskSnapshot = await ref.child(imageId).putFile(File(e)); return await taskSnapshot.ref.getDownloadURL(); }).toList()); DocumentSnapshot<Map<String, dynamic>> userSnapshot = await userDocRef.get(); UserModel userModel = UserModel.fromMap(userSnapshot.data()!); FeedModel feedModel = FeedModel.fromMap({ 'uid': uid, 'feedId': feedId, 'desc': desc, 'imageUrls': imageUrls, 'likes': [], 'likeCount': 0, 'commentCount': 0, 'createAt': Timestamp.now(), 'writer': userModel, }); await feedDocRef.set(feedModel.toMap(userDocRef: userDocRef)); // await feedDocRef.set({ // 'uid': uid, // 'feedId': feedId, // 'desc': desc, // 'imageUrls': imageUrls, // 'likes': [], // 'commentCount': 0, // 'likeCount': 0, // 'creatAt': Timestamp.now(), // 'writer': userDocRef, // }); await userDocRef.update({ 'feedCount': FieldValue.increment(1), }); } } 바쁘실 텐데 질문 읽어주셔서 감사합니다.
-
미해결[LV1] Jetpack Compose - UI 연습하기
TopAppBar 관련부분에 빨간줄이 ..
실행하면Type mismatch: inferred type is Unit but Modifier was expected : 27즉 27번 라인에서 오류가 난다네요ㅠㅠㅠ
-
미해결프리다(Frida)를 이용한 안드로이드 앱 모의해킹
APK, 특정 클래스에서 사용되는 함수의 호출 그래프
안녕하세요 Frida 공부중인 학생입니다.다름이 아니라 APK 파일에 대해서 다양한 Frida 사용법을 익히고 있는 중에Frida trace 기능을 통해 특정 클래스의 함수들의 목록을 출력하는 것을 사용해보았습니다.이러던 와중 궁금한 사항이 생겨 질문을 드립니다.특정 클래스에서 사용된 메소드가 다른 클래스의 함수를 호출하는 상황과 같이 함수들의 호출 경로를 모두 출력하여 함수 호출 그래프와 유사한 출력물을 만들수 있을지 궁금하여 질문 드립니다. 감사합니다.
-
미해결Flutter 초입문 왕초보편
지도위에 이동 경로 스리기
지도위에 이동경로 그리는 부분에서새로운 경로가 그려지고 조금 있으면 경로가 지워 집니다. 이렇게 동작하는 것이 정상인가요?설명 중에는 그런 내용에 없어 문의 드립니다.