묻고 답해요
150만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
순위 정보를
불러오고 있어요
-
미해결Flutter 고급 - 현업 수준의 아키텍처
jdk 설정 및 오류
안녕하세요 질문이 2개있습니다. 강의 듣던중 에뮬레이터 실행하니FAILURE: Build failed with an exception.* Where:Build file 'C:\workspace\Flutter\android\app\build.gradle' line: 5* What went wrong:An exception occurred applying plugin request [id: 'dev.flutter.flutter-gradle-plugin']> Failed to apply plugin 'dev.flutter.flutter-gradle-plugin'. > No such property: source for class: java.lang.String* Try:> Run with --stacktrace option to get the stack trace.> 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.orgBUILD FAILED in 590msError: Gradle task assembleDebug failed with exit code 1 에러가 났는데 뭐가문제일까요?plugins { id "com.android.application" id "kotlin-android" // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. id "dev.flutter.flutter-gradle-plugin" } android { namespace = "com.survivalcoding.flutter_recipe_app_course" compileSdk = flutter.compileSdkVersion ndkVersion = flutter.ndkVersion compileOptions { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = JavaVersion.VERSION_1_8 } defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId = "com.survivalcoding.flutter_recipe_app_course" // You can update the following values to match your application needs. // For more information, see: https://flutter.dev/to/review-gradle-config. minSdk = flutter.minSdkVersion targetSdk = flutter.targetSdkVersion versionCode = flutter.versionCode versionName = flutter.versionName } buildTypes { release { // TODO: Add your own signing config for the release build. // Signing with the debug keys for now, so `flutter run --release` works. signingConfig = signingConfigs.debug } } } flutter { source = "../.." } ============================================================ file > settings > build Tools > gradle 설정 부분에서 jdk 설정부분이 없습니다.PS C:\workspace\Flutter> flutter config --listAll Settings: enable-web: (Not set) enable-linux-desktop: (Not set) enable-macos-desktop: (Not set) enable-windows-desktop: (Not set) enable-android: (Not set) enable-ios: (Not set) enable-fuchsia: (Not set) (Unavailable) enable-custom-devices: (Not set) cli-animations: (Not set) enable-native-assets: (Not set) (Unavailable) enable-flutter-preview: (Not set) (Unavailable) enable-swift-package-manager: (Not set) (Unavailable) jdk-dir: C:\Program Files\Java\jdk-17PS C:\workspace\Flutter> flutter doctor -v[√] Flutter (Channel stable, 3.24.0, on Microsoft Windows [Version 10.0.26100.2314], locale ko-KR) • Flutter version 3.24.0 on channel stable at C:\flutter • Upstream repository https://github.com/flutter/flutter.git • Framework revision 80c2e84975 (8 months ago), 2024-07-30 23:06:49 +0700 • Engine revision b8800d88be • Dart version 3.5.0 • DevTools version 2.37.2[√] Windows Version (Installed version of Windows is version 10 or higher)[√] Android toolchain - develop for Android devices (Android SDK version 35.0.1) • Android SDK at C:\Users\hong\AppData\Local\Android\sdk • Platform android-35, build-tools 35.0.1 • Java binary at: C:\Program Files\Java\jdk-17\bin\java • Java version Java(TM) SE Runtime Environment (build 17.0.14+8-LTS-191) • All Android licenses accepted.[√] Chrome - develop for the web • Chrome at C:\Program Files\Google\Chrome\Application\chrome.exe[!] Visual Studio - develop Windows apps (Visual Studio Build Tools 2019 16.11.42) • Visual Studio at C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools • Visual Studio Build Tools 2019 version 16.11.35425.106 • Windows 10 SDK version 10.0.19041.0 X The current Visual Studio installation is incomplete. Please use Visual Studio Installer to complete the installation or reinstall Visual Studio.[√] Android Studio (version 2024.3) • Android Studio at C:\Program Files\Android\Android Studio • Flutter plugin can be installed from: https://plugins.jetbrains.com/plugin/9212-flutter • Dart plugin can be installed from: https://plugins.jetbrains.com/plugin/6351-dart • Java version OpenJDK Runtime Environment (build 21.0.5+-12932927-b750.29)[√] VS Code (version 1.96.4) • VS Code at C:\Users\hong\AppData\Local\Programs\Microsoft VS Code • Flutter extension can be installed from: https://marketplace.visualstudio.com/items?itemName=Dart-Code.flutter[√] Connected device (4 available) • sdk gphone64 x86 64 (mobile) • emulator-5554 • android-x64 • Android 16 (API 36) (emulator) • Windows (desktop) • windows • windows-x64 • Microsoft Windows [Version 10.0.26100.2314] • Chrome (web) • chrome • web-javascript • Google Chrome 134.0.6998.89 • Edge (web) • edge • web-javascript • Microsoft Edge 132.0.2957.127[√] Network resources • All expected network resources are available.! Doctor found issues in 1 category.PS C:\workspace\Flutter> flutter config --list 명령어하면 jdk는 17이고 flutter doctor -v 하면 jdk가 21로잡혀있어서 버전이 다른데 jdk 설정하는부분이 없는데 어떻게하면 오류해결과 jdk 수동설정 가능하게 할 수 있을까요?
-
미해결Flutter 중급 3편 - 의존성 주입 가이드
DI 에 대해 문의 좀 드립니다.
di 관련해서 문의 좀 드리겠습니다.선생님 강의를 듣고 get_it, injectable 패키지를 사용해서 di 를 실 프로젝트에도 적용 하고 있습니다.여러 singleton 으로 생성 한 여러 usecace들을 한군데 모아 둔 usecases(OrderDetailUseCases) 를 만들어 viewModel 에 주입해서 사용하는 것을 보고 실 프로젝트에도 사용하고 있습니다.아래 처럼요.@singleton class OrderDetailUseCases { final GetOrderDetailUseCase getDetail; final GetGoodsForBasketUseCase getGoodsForBasket; final DeleteOrderUseCase deleteOrder; OrderDetailUseCases( this.getDetail, this.getGoodsForBasket, this.deleteOrder, ); } 그런데 나중에 새로운 usecase(AddOrderUseCase) 가 생겨서 위 OrderDetailUseCases 에 추가하면아래와 같은 오류가 뜹니다.Bad state: GetIt: Object/factory with type OrderDetailUseCases is not registered inside GetIt.(Did you accidentally do GetIt sl=GetIt.instance(); instead of GetIt sl=GetIt.instance;Did you forget to register it?) 기존에 추가 했던 getDetail, getGooodsForBasket usecase 는 잘 사용하고 있습니다분명 build runner 명령어를 실행 해 줬음에도 불구하구요.그래서 DeleteOrderUseCase 는 따로 가져와 viewModel 에 전달해주고 있습니다. 아래처럼요.final orderDetailViewModelProvier = StateNotifierProvider<OrderDetailViewModel, OrderDetailState>((ref) { final useCases = getIt<OrderDetailUseCases>(); final deleteOrderUc = getIt<DeleteOrderUseCase>(); return OrderDetailViewModel( useCases, deleteOrderUc, ); });전 하나의 useCases 에 다 넣고 싶거든요..ㅡ,.ㅡ이게 패키지가 좀 stable 하지 못한 거 같은 느낌인데 이런 경우를 못 보셨는지요?경우가 있다면 어떻게 해법이 있는지 들어보고 싶습니다.
-
미해결Flutter 고급 - 현업 수준의 아키텍처
텍스트 전체입력 후 검색 결과 조회
SearchInputField에서 onChanged를 onSubmitted로만 바꿔주면 키보드에서 return 버튼 눌렀을때 적용되더라구요^^
-
미해결Flutter 고급 - 현업 수준의 아키텍처
라이브 템플릿 링크 어디서 확인하나요?
1:44에 링크로 공유된다고 하셨는데 강의노트에 따로 올라와있는게 없어서요.. 어디서 확인하면 되나요?
-
미해결Flutter 고급 - 현업 수준의 아키텍처
ingredient view model의 _loadRecipe
ingredient view model 의 _loadRecipe 함수는 생성자에서실행이 안되는 이유에 대해서 궁금합니다.동일하게 _getDishesByCategoryUseCase.execute를 사용하는 _fetchDishesByCategory 는home view model에서 생성자에서 쓰이는데 어떤 차이가 있나요
-
해결됨[포트폴리오] 안드로이드 앱 만들기 - 이론편
본 강의는 로드맵 어디쯤에서 들으면 좋을까요
선생님 로드맵에는 해당 강의가 명시되어있지 않아서,,, 로드맵중 어느 사이에 들어야 이해가 쉬울까요?
-
미해결Flutter 고급 - 현업 수준의 아키텍처
BigButton 만들때.
BigButton 컴포넌트 만들때elevatedButton을 사용하지않고container위젯을 사용하는 이유가있을까요?
-
미해결iOS Clean Architecture & MVVM: RxSwift 완전 정복
유즈케이스 프로토콜과 구현체의 분리 이유
덤벨로퍼님 안녕하세요! 덕분에 좋은 강의 잘 듣고 있습니다!!유즈케이스의 경우 프로토콜과 구현체를 분리해서 구현하셨고, 보통 다른 사람들도 분리해서 구현하더라구요.만약 기능 단위로 유즈케이스를 구현하게 된다면 굳이 프로토콜과 구현체를 분리안해도 될 것 같은데, 둘을 분리하여 얻을 수 있는 이점이 궁금합니다!의존성 관리 측면에서 이점이 있다고 생각은 되는데 잘 와닿지가 않아서요ㅠㅠ답변해주시면 감사하겠습니다 :)
-
해결됨Flutter 중급 3편 - 의존성 주입 가이드
Bad state 에러
안녕하세요.아래와 같은 오류가 나서 해결을 하려고 했습니다.제공해주신 완성 본 코드와 비교하니 정확하게 일치했구요.E/flutter (22734): [ERROR:flutter/runtime/dart_vm_initializer.cc(40)] Unhandled Exception: Bad state: GetIt: Object/factory with type StoreRepository is not registered inside GetIt. E/flutter (22734): (Did you accidentally do GetIt sl=GetIt.instance(); instead of GetIt sl=GetIt.instance;이해가 안되어서 di_setup_config.dart파일을 보는데const String dev = 'dev'; const String prod = 'prod'; extension GetItInjectableX on i174.GetIt { // initializes the registration of main-scope dependencies inside of GetIt i174.GetIt init({ String? environment, i526.EnvironmentFilter? environmentFilter, }) { final gh = i526.GetItHelper( this, environment, environmentFilter, ); gh.singleton<_i149.LocationPermissionHandler>( () => i399.MockLocationPermissionHandler(), registerFor: {dev}, ); gh.singleton<_i872.StoreRepository>( () => i399.MockStoreRepositoryImpl(), registerFor: {dev}, ); gh.singleton<_i920.LocationRepository>( () => i399.MockLocationRepositoryImpl(), registerFor: {dev}, ); gh.singleton<_i716.GetNearByStoresUseCase>( () => i716.GetNearByStoresUseCase( storeRepository: gh<i872.StoreRepository>(), locationRepository: gh<_i920.LocationRepository>(), locationPermissionHandler: gh<_i149.LocationPermissionHandler>(), )); gh.singleton<_i920.LocationRepository>( () => i359.LocationRepositoryImpl(), registerFor: {prod}, ); gh.singleton<_i872.StoreRepository>( () => i303.StoreRepositoryImpl(), registerFor: {prod}, ); gh.singleton<_i149.LocationPermissionHandler>( () => i148.LocationPermissionHandlerImpl(), registerFor: {prod}, ); gh.factory<_i912.MainViewModel>( () => i912.MainViewModel(gh<i716.GetNearByStoresUseCase>())); return this; } }GetNearByStoresUseCase 코드가 prod버전의 코드들 보다 상위에 배치되어서 발생했습니다.di_setup_config.dart파일을 자동으로 생성되는 파일인데 매번 dart run build_runner build 할 때 마다 일일이 수동으로 수정을 해줘야 할까요?flutter pub run build_runner build --delete-conflicting-outputs를 해도 동일합니다.
-
미해결Flutter 고급 - 현업 수준의 아키텍처
31강 stream 활용시 어떤장점이 있나요?
북마크를 future 대비 stream으로 할 때 장점이 (자세하게) 궁금합니다.감사합니다.
-
미해결Flutter 고급 - 현업 수준의 아키텍처
view model 은 팩토리로 생성하는 이유
23강의 5:10에서 usecase,repository 는 싱글톤으로 만들고, viewmodel은 팩토리로 만드는 것이 일반적이라고 하셨습니다.싱글톤으로 만드는 것은 이해했는데, 팩토리를 사용하는 이유는 무엇일까요? viewModel 안의 state 의 내용이 UI 의 데이터로 채워지고, viewModel 안의 state 는 가변적이니 싱글턴으로 하는게 맞지 않을까라는 생각이 갑자기 들어서요. viewModel을 다시 만드는 것이 어떤 경우가 있는지 궁금합니다. 강의항상 재밌게 듣고 있습니다. 감사합니다.
-
미해결Flutter 고급 - 현업 수준의 아키텍처
domain 에 data_source 를 만드는 이유.
강의 항상 잘 듣고 있습니다.질문이 하나 생겨서 여쭤봅니다.20강 30~33분 정도에서 domain 폴더에 data_source 폴더를 만드시는 이유를 다시 설명해주실 수 있을까요? 아래는 제가 생각하는 부분입니다. data/ 의 data/data_source/ 는 data/repository/ 에서 사용하는 부분임.domain/ 은 사실상 data/data_source/ 를 직접 접근하지 않고 domain/repository 를 활용하는 domain/use_case 를 통해 접근함.이렇게 생각이 들다보니, "domain 에서 data_source 의 인터페이스를 정의하는 것이 맞는건가?" 생각이 듭니다. 감사합니다.
-
해결됨iOS Clean Architecture & MVVM: RxSwift 완전 정복
즐겨찾기 탭에서 페이지네이션 422 서버 에러
안녕하세요, 페이지네이션 부분 오류가 있는 것 같아 질문 드립니다! UserListViewController에서 'bindView()' 메서드에서 페이지네이션을 구현하고 있습니다.강의 내용과 같이 구현하면, 즐겨찾기 유저를 여러 명 추가 후 다시 앱을 실행했을 때, Core Data에 저장된 즐겨찾기 유저 목록은 그대로 표시됩니다. 즐겨찾기 목록 테이블뷰를 맨 밑으로 스크롤 하면 422 서버에러가 발생합니다.테이블뷰의 맨 밑으로 스크롤 하면 바인딩 되어 있던 tableView의 prefetchRows(또는, willDisplayCell)의 코드가 실행되게 되고 fetchMore의 값이 변경되어 fetchUser()가 실행되어 output의 값이 변경되는데, 이때 텍스트필드 값은 비어있기 때문에 데이터를 받아오는 과정에서 422 에러가 발생하는 것이라 예상됩니다. 아래 코드와 같이 row를 받아 올 때, self?.tabButtonView.selectedType.value == .api를 추가하여 selectedType이 api 타입일 때만 fetchMore의 값이 변경되도록 수정하면 422 에러가 발생하지 않습니다.제가 생각한 오류의 원인과 해결 과정이 올바른지 질문드립니다! tableView.rx.willDisplayCell.bind {[weak self] (cell, indexPath) in guard let row = self?.tableView.numberOfRows(inSection: 0), self?.tabButtonView.selectedType.value == .api else {return} if indexPath.item >= row - 1 { self?.fetchMore.accept(()) } }.disposed(by: disposeBag) }
-
해결됨iOS Clean Architecture & MVVM: RxSwift 완전 정복
NetworkManager의 tokenHeader 관련 질문 드립니다!
안녕하세요, 덤벨로퍼님! 좋은 강의 감사드립니다!덕분에 좋은 코드 많이 보고 배울 수 있었습니다. 복습 중에 API 헤더 관련해서 궁금한 점이 있어 질문드려요. 강의에서는 API에서 필요로 하는 헤더를 NetworkManager 클래스에서 정의하고 사용하고 있습니다. 규모가 있는 앱에서는 API가 많고 서로 다른 헤더를 필요로 할 거라고 예상이 되는데 NetworkManagerProtocol의 'fetchData()' 메서드에서 파라미터로 헤더를 같이 받아오는 것이 효율적인지 궁금합니다. userNetwork의 'fetchUser()' 메서드 내에서 url과 header를 같이 생성하고 networkManager의 메서드 파라미터로 넘겨주는 방법이 괜찮은 방법일까요?
-
미해결iOS Clean Architecture & MVVM: RxSwift 완전 정복
[클린 아키텍쳐] 로컬 Json 파싱
안녕하세요! 클린 아키텍쳐 관련 질문있습니다.API 통신이 아니라 로컬에 저장된 json 파일에서 앱 실행시 한번 FileManager로 파싱하고자 하는데, 클린 아키텍쳐 구조로 진행하려면 어떤 구조로 될까요? Domain > Entity 영역에 City 모델을 만든 상태입니다.기능은 크게 2가지로 load하고 search하는 기능이 있습니다. load 한 이후에는 변수를 통해 search하면 되서 search는 뷰 모델에 정의하는게 맞는지, load의 경우 UseCaseProtocol 로 해야하는지 어떤 방식이 적합한지 여쭤봅니다. 추가로 API 통신하는 경우에도 로딩한 후 모델로 가공해서 보여주는 기능만 있는데, 그럴 경우에는 어떻게 진행하는걸 추천하시나요? API 로 선택한 항목에 대한 정보를 로딩하고 데이터 가공해서 UI에 보여주는 경우입니다.. 감사합니다.
-
해결됨iOS Clean Architecture & MVVM: RxSwift 완전 정복
의존성 주입에 관하여 질문있습니다.
let coredata = UserCoreData(viewContext: appDelegate.persistentContainer.viewContext) let network = UserNetwork(manager: NetworkManager(session: UserSession())) let userRP = UserRepository(coreData: coredata, network: network) // Domain Layer let userUC = UserListUsecase(respository: userRP) let userVM = UserListViewModel(usecase: userUC) // Presentation Layer let userVC = UserListViewController(viewModel: userVM)하나의 뷰 컨트롤러를 생성 시 ViewModel, UseCase, Repository, Network, CoreData 등 주입할 요소가 많아지는 것을 느꼈습니다.그렇다면 화면전환을 수행할 때마다 뷰 컨트롤러를 생성하게 되는데 매번 해당 컨트롤러에 의존성을 주입해주어야 하나요?또한 Network, CoreData 등 동일한 객체를 유지하기 위해서 이전화면의 ViewModel 객체를 다음화면의 ViewModel로 넘겨주면 될까요?궁극적으로 실무에서 사용하는 방식을 알고 싶습니다.
-
미해결iOS Clean Architecture & MVVM: RxSwift 완전 정복
강의 자료는 어디서 받을수 있나요?
강의에 사용되는 자료와 코드들은 어디서 받을 수 있나요?
-
해결됨iOS Clean Architecture & MVVM: RxSwift 완전 정복
강의 질문있습니다.
질문강의 중 스냅킷을 사용하여 이미지 뷰의 제약을 설정하셨는데make.leading.top.bottom.equalToSuperview().inset(20) make.width.height.equalTo(80).top과 bottom을 상위 뷰에 걸어 상대적 높이를 설정했으나, 절대적 높이 height도 별도로 걸어주신 이유가 있을까요?
-
미해결Flutter 중급 3편 - 의존성 주입 가이드
여러 화면 di강의는 언제 나올 예정인가요?
제목 그대로 다음 강의가 언제 나오는지 궁금합니다.
-
해결됨Flutter 중급 3편 - 의존성 주입 가이드
Riverpod 프로바이더에 의존성 주입
안녕하세요.선생님 강의를 듣고 MVVM 패턴에 DI 를 적용 해 보다가 질문이 있어 글 남깁니다.저는 Riverpod Provider 를 적용 해 보려고 하는데요.선생님께서 사용 하시는 ChangeNotifierProvider 에 DI 를 go_router 에 설정 하셨는데요.만일 RiverPod Provider 를 사용 한다면 어떻게 적용 해야 할까요?ViewModel안에서 UseCase를 생성자에서 받고 있어서 결국 라우터 안에 주입을 해 줘야 할꺼 같은데RiverPod 프로바이더에서는 어떻게 해 줘야 할지 모르겠네요.ㅡ,.ㅡ가이드 좀 부탁드립니다.
주간 인기글
순위 정보를
불러오고 있어요