묻고 답해요
160만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
타입 관련 질문있습니다
final resp = await [Permission.camera, Permission.microphone].request(); 여기서 [ ] 대괄호 안에 permission.camera와 permission.microphone을 넣어주고 있는데 [ ] 대괄호 안에 넣는 타입은 리스트 타입으로 한번에 넘겨줄려고 저렇게 괄호 안에 쓰는건지 궁금합니다.어떤 이유로 대괄호를 사용하는지가 궁금합니다.
-
해결됨[2025 리뉴얼]플러터플로우로 코딩 없이 한달 안에 앱 만들기
특정강의 사운드가 한쪽만 들립니다.
다 그런건 아닌것 같구 가장 기본이자 가장 많이 활용하는 Column, Row 강의에서 사운드가 한쪽만 들리는데 저만 그런가 해서요.스피커가 아니라 헤드셋을 써서 강의들 듣다보니 한쪽만 들려요..ㅎㅎ
-
해결됨Flutter로 SNS 앱 만들기
Provider 사용법 질문
저는 원래 Provider를 ChangeNotifier와 함께 사용하여notifyListener()를 통해 필요할 때 빌드호출을 진행하였습니다 이 강의에서는 각 State를 extends하고 LocatorMixin 후read/watch를 통해 상태를 관리하는 것 같습니다 보통 state를 따로 만들어 stateNotifier로 관리하는 게 더욱 표준적인 방법일까요?
-
해결됨[Bloc 응용] 실전 앱 만들기 (책 리뷰 앱) : SNS 로그인, Firebase 적용, Bloc 상태 관리, GoRouter
GoogleService-Info.plist > REVERSED_CLIENT_ID 안보입니다.
아무리 찾아봐도 안보이는데 뭐가 잘못된 것일까요?<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>API_KEY</key> <string>AIzaSyDrx2zMhB0rjE20rHntX6p1qG2Ya5y39JA</string> <key>GCM_SENDER_ID</key> <string>914949717898</string> <key>PLIST_VERSION</key> <string>1</string> <key>BUNDLE_ID</key> <string>com.archy712.bookreviewhome01.bookreviewHome01</string> <key>PROJECT_ID</key> <string>bookreview-home-01</string> <key>STORAGE_BUCKET</key> <string>bookreview-home-01.appspot.com</string> <key>IS_ADS_ENABLED</key> <false></false> <key>IS_ANALYTICS_ENABLED</key> <false></false> <key>IS_APPINVITE_ENABLED</key> <true></true> <key>IS_GCM_ENABLED</key> <true></true> <key>IS_SIGNIN_ENABLED</key> <true></true> <key>GOOGLE_APP_ID</key> <string>1:914949717898:ios:66b1d2b693a784b6029273</string> </dict> </plist>
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
RatingPagination 렌더링 부분에서 api 요청이 가지 않고 있습니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.코드팩토리 디스코드https://bit.ly/3HzRzUMFlutter 강의를 구매하시면 코드팩토리 디스코드 서버 플러터 프리미엄 채널에 들어오실 수 있습니다! 디스코드 서버에 들어오시고 저에게 메세지로 강의를 구매하신 이메일을 보내주시면 프리미엄 채널에 등록해드려요! 프리미엄 채널에 들어오시면 모든 질의응답 최우선으로 답변해드립니다! RatingPagination 렌더링 강의에서 http://ip/restaurant/:rid/rating으로 요청이 가지 않고 있습니다! 어떤 부분을 놓치고 있을까요? restaurant_detail_screen.dartclass RestaurantDetailScreen extends ConsumerStatefulWidget { final String id; const RestaurantDetailScreen({required this.id, super.key}); @override ConsumerState<RestaurantDetailScreen> createState() => _RestaurantDetailScreenState(); } class _RestaurantDetailScreenState extends ConsumerState<RestaurantDetailScreen> { @override void initState() { super.initState(); ref.read(restaurantProvider.notifier).getDetail(id: widget.id); } @override Widget build(BuildContext context) { final state = ref.watch(restaurantDetailProvider(widget.id)); final ratingsState = ref.watch(restaurantRatingProvider(widget.id)); if (state == null) { return DefaultLayout( child: Center( child: CircularProgressIndicator(), ), ); } return DefaultLayout( title: '불타는 떡볶이', child: CustomScrollView( slivers: [ renderTop( model: state!, ), if (state is! RestaurantDetailModel) renderLoading(), if (state is RestaurantDetailModel) renderLabel(), if (state is RestaurantDetailModel) renderProduct( products: state.products, ), if(ratingsState is CursorPagination<RatingModel>) renderRatings(models: ratingsState.data), ], ), ); } SliverPadding renderRatings({ required List<RatingModel> models, }){ return SliverPadding( padding: EdgeInsets.symmetric(horizontal: 16.0), sliver: SliverList( delegate: SliverChildBuilderDelegate( (_, index) => RatingCard.fromModel( model: models[index], ), childCount: models.length, ), ) ); } //skeleton 사용 -> 로딩중에는 미리보는것 같은 효과 가져오기 SliverPadding renderLoading() { return SliverPadding( padding: EdgeInsets.symmetric( vertical: 16.0, horizontal: 16.0, ), sliver: SliverList( delegate: SliverChildListDelegate( List.generate( 3, (index) => Padding( padding: const EdgeInsets.only(bottom: 32.0), child: SkeletonParagraph( style: SkeletonParagraphStyle( lines: 5, padding: EdgeInsets.zero, ), ), ), ), ), ), ); } // 일반 위젯을 slivers에 추가하려면 SliverToBoxAdapter로 감싸줘야 한다. SliverToBoxAdapter renderTop({ required RestaurantModel model, }) { return SliverToBoxAdapter( child: RestaurantCard.fromModel( model: model, isDetail: true, ), ); } SliverPadding renderLabel() { return SliverPadding( padding: EdgeInsets.symmetric(horizontal: 16.0), sliver: SliverToBoxAdapter( child: Text( '메뉴', style: TextStyle( fontSize: 18.0, fontWeight: FontWeight.w500, ), ), ), ); } SliverPadding renderProduct({ required List<RestaurantProductModel> products, }) { return SliverPadding( padding: EdgeInsets.symmetric(horizontal: 16.0), sliver: SliverList( delegate: SliverChildBuilderDelegate( (context, index) { final model = products[index]; return Padding( padding: const EdgeInsets.only(top: 16.0), child: ProductCard.fromModel( model: model, ), ); }, childCount: products.length, ), ), ); } } restaurantRatingProviderfinal restaurantRatingProvider = StateNotifierProvider.family<RestaurantRatingStateNotifier, CursorPaginationBase, String>((ref, id){ final repository = ref.watch(restaurantRatingRepositoryProvider(id)); return RestaurantRatingStateNotifier(repository: repository); }); class RestaurantRatingStateNotifier extends StateNotifier<CursorPaginationBase> { final RestaurantRatingRepository repository; RestaurantRatingStateNotifier({ required this.repository, }) : super( CursorPaginationLoading(), ); } restaurantRatingRepositoryProviderfinal restaurantRatingRepositoryProvider = Provider.family<RestaurantRatingRepository, String>((ref, id) { final dio = ref.watch(dioProvider); return RestaurantRatingRepository(dio, baseUrl: 'http://$ip/restaurant/$id/rating'); }); // http://ip/restaurant/:rid/rating @RestApi() abstract class RestaurantRatingRepository implements IBasePaginationRepository<RatingModel>{ factory RestaurantRatingRepository(Dio dio, {String baseUrl}) = _RestaurantRatingRepository; @GET('/') @Headers({ 'accessToken': 'true', }) Future<CursorPagination<RatingModel>> paginate({ @Queries() PaginationParams? paginationParams = const PaginationParams(), //@Queries() -> PaginationParams 클래스의 값들이 자동으로 쿼리로 변환되어서 요청할 때 들어감! }); }
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
리포맷팅이 안되는 코드
상기 코드 저 라인은 리포맷팅이 안됩니다.아래는 강사님 강의하시는거 캡쳐한 이미지입니다.
-
해결됨Flutter로 SNS 앱 만들기
Firebase
Firebase로 배포까지 가능한가용 .?
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
토큰 관련 질문입니다!
안녕하세요! 코드팩토리님현재 장바구니 관련 강의를 듣고 있습니다만, 「RefreshToken 만료되면 로그아웃」 강의까지가 토큰 처리 관련해서 질문이 있습니다.lib/dio/dio.dart 파일에서 토큰 관련 처리를 하는걸로 알고있습니다. accessToken이 만료되면 onError 메소드가 실행되고 accessToken이 재발급되는 구조로 이해하고 있는데 맞나요..??제가 이해하고 있는게 맞는거라면 onError라는 메소드가 실행이 되어야 하는데 onError메소드는 실행이 안되고 401에러(잘못된 토큰입니다.)가 난 상태에서 멈춰버리더라구요..(vscode로 공부중입니다.)코드팩토리님의 소스(https://github.com/codefactory-co/flutter-lv2-rest-api)도 받아서 실행해보았습니다만, 저하고 똑같은 에러가 발생되고 앱이 멈췄습니다.onError메소드가 실행이 안되는 이유를 잘모르겠습니다..ㅠ혹시 몰라 저의 깃허브도 올립니다.(dev브랜치로 봐주시면 감사하겠습니다.)https://github.com/limchangmin95/flutter_delivery/tree/dev
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
Android Studio Intel x86 Emulator 설치 오류
노트북이 라이젠 환경이라 설치하는데 계속 오류가 발생합니다혹시 해당 프로그램 설치가 필수인가요?필수면 해결 방법 알려주세요ㅠㅠ
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
dropdownbutton에 대한 강의는 어디서 볼수있나요.
flutter 공식문서를 보고 따라했는데도 오류가 많이뜨고 마음대로 되지가 않네요. 특히 border부분 둥글게 하는거 수정하는게 어렵습니다.
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
안드로이드 스튜디오에서 리포맷팅할때 이상하게 인덴트가 먹힐때가 있어요
안드로이드 스튜디오에서opt + command + l 이용해서 리포맷팅을 하면 인덴테이션이 제대로 안될때가 있어요. (들여쓰기가 이상하게 됨)안드로이드 스튜디오 자체의 문제인지..다른 방법이 있는지 문의드립니다.
-
해결됨Flutter로 SNS 앱 만들기
flutter 프로젝트와 firebase연동
확인차 문의 드려요. 새 프로젝트 할때 마다 강의 내용처럼 매번 설치 해야 되는거죠.npm install -g firebase-toolsdart pub global activate flutterfire_cli..
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
연결기계 없음
위에서 말씀드린 것처럼 에뮬레이터를 실행해도 device 목록에 뜨지 않고 에뮬레이터를 실행하고 재생버튼을 누르면위와 같은 메세지가 뜹니다.
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
ref.read, ref.write, ref.listen이 헷갈려요!
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.코드팩토리 디스코드https://bit.ly/3HzRzUMFlutter 강의를 구매하시면 코드팩토리 디스코드 서버 플러터 프리미엄 채널에 들어오실 수 있습니다! 디스코드 서버에 들어오시고 저에게 메세지로 강의를 구매하신 이메일을 보내주시면 프리미엄 채널에 등록해드려요! 프리미엄 채널에 들어오시면 모든 질의응답 최우선으로 답변해드립니다! provider를 사용할 때 ref.read는 on click 함수처럼 이벤트있는 곳에서 한번만 사용할 때 쓴다고 이해했는데,splashScreen의 checkToken함수 내부에서는 ref.read(secureStorageProvider)로 사용하고restaurantDetailScreen의 getRestaurantDetail 함수 내부에서는 ref.watch(dioProvider)로 사용한 이유가 뭘까요? 그리고 ref.listen은 이것들과 어떻게 다른 상황에서 쓰이는지 헷갈립니다.
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
flutter로 개발한 앱 소유권 이전
안녕하세요. 강사님현재 앱 소유권 이전을 준비하고 있습니다.구글플레이 스토어앱스토어이전 A계정에서 소유하고 있던 앱을 B계정으로 이전하려고 합니다.사유는 회사가 물적분할을 하면서 다른 회사가 되어버리는 상황이 발생하여앱 소유권 역시 변경을 해야하는 상황입니다. 구글링을 하면서 찾아본 부분으로는 계정의 앱 이동을 무리없이 진행할 수 있을 것 같은데,문제는 파이어베이스가 걸려있어서 고민을 하고 있는 중입니다ㅠㅠ 질문A계정에서 B계정으로 앱 소유권을 이전시 파이어베이스도 동일하게 이전이 되는 걸까요?1번이 아니라면 B에도 A와 동일하게 파이어베이스 프로젝트를 생성 및 데이터 이관을 해야하나요?기준 정보가 모두 변경될텐데, 앱 내에 B계정 정보와 신규 파이어베이스 정보를 모두 업데이트하야하는거죠?강의를 들으며, 유지보수는 할 수 있게 되었지만, 해당 부분은 처음이라서ㅠㅠ경험이 있으신지 문의드립니다. 확인 부탁드립니다.
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
코드팩토리의 플러터 프로그래밍 2판 도서 질문
먼저 코드팩토리 플러터 프로그래밍 2판 출간 축하드립니다.1판이 워낙 좋아서 2판이 나오는 것이겠지요 ㅎㅎ 질문 드릴 사항은,제가 작년에 1판 도서와 본 강의도 구매해두었는데요,작년엔 스터디하지 못하고 올해 들어서 이제 시작 하려고 하는데,갑자기 도서 2판에 대한 정보를 알게되어서 문의를 드립니다. 2판 도서가 2월1일 출간으로 알고 있는데,2판 도서가 출간되면 강의의 커리큘럼이나 순서가 2판 기준으로 변경이 되나요?(출간예정도서 목차를 보니 1판하고 좀 다른부분이 있더라구요)아님 강의가 그대로라면, 1판 도서 또는 2판 도서와의 강의 싱크가 맞지 않을수도 있을것 같아서요 어떻게 준비하면 좋을지,그냥 1판도서로 쭉 스터디를 해도 괜찮을지,아님 2월에 2판이 나오면 2판을 구매하여 스터디를 하는게 싱크가 잘 맞을지,(dart나 안드로이드스튜디오 버전도 좀 다를텐데..)관련해서 조언해주시면 감사하겠습니다!
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
연결기계가 뜨지 않습니다.
Flutter를 클릭했을 때 화면은 뜨지만 기계명이 뜨지 않습니다.아래와 같은 오류메세지가 뜹니다
-
해결됨Flutter 앱 개발 실전
riverpod 코드 변환 질문
안녕하세요.기회가 되신다면 코드 전체를 riverpod 버전으로 변경해서 notion 에 올려주실 수 있으실까요?riverpod 버전으로 변경해보면서 Dart 문법에 대해 더 이해하게 되는 거 같습니다. 코드변환 질문1class LangService with ChangeNotifier { /// 현재 언어 Locale locale; LangService({ Locale? locale, }) : locale = locale ?? IntlHelper.en; /// 언어 변경 void toggleLang() { locale = IntlHelper.isKo ? IntlHelper.en : IntlHelper.ko; notifyListeners(); } }위 코드를 final langProvider = NotifierProvider<LangNotifier, Locale?> (LangNotifier.new); class LangNotifier extends Notifier<Locale?> { @override Locale? build() => IntlHelper.en; /// 언어 변경 void toggleLang() { state = IntlHelper.isKo ? IntlHelper.en : IntlHelper.ko; } }로 변경하면 맞나요? Notifier<Locale> 로 해야 하는지?Notifier<Locale?> 로 해야 하는지요? 코드변환 질문2class ThemeService with ChangeNotifier { ThemeService({ AppTheme? theme, }) : theme = theme ?? LightTheme(); /// 현재 테마 AppTheme theme; /// 테마 변경 void toggleTheme() { if (theme.brightness == Brightness.light) { theme = DarkTheme(); } else { theme = LightTheme(); } notifyListeners(); } /// Material ThemeData 커스텀 ThemeData get themeData { return ThemeData( /// Scaffold scaffoldBackgroundColor: theme.color.surface, /// AppBar appBarTheme: AppBarTheme( backgroundColor: theme.color.surface, elevation: 0, centerTitle: false, iconTheme: IconThemeData( color: theme.color.text, ), titleTextStyle: theme.typo.headline2.copyWith( color: theme.color.text, ), ), /// BottomSheet bottomSheetTheme: const BottomSheetThemeData( backgroundColor: Colors.transparent, constraints: BoxConstraints( maxWidth: Breakpoints.bottomSheet, ), ), ); } } extension ThemeServiceExt on BuildContext { ThemeService get themeService => watch<ThemeService>(); AppTheme get theme => themeService.theme; AppColor get color => theme.color; AppDeco get deco => theme.deco; AppTypo get typo => theme.typo; }위 코드를final themeProvider = NotifierProvider<ThemeNotifier, AppTheme>(ThemeNotifier.new); class ThemeNotifier extends Notifier<AppTheme> { @override AppTheme build() => LightTheme(); AppTheme get theme => state; AppColor get color => state.color; AppDeco get deco => state.deco; AppTypo get typo => state.typo; /// 테마 변경 void toggleTheme() { if (state.brightness == Brightness.light) { state = DarkTheme(); } else { state = LightTheme(); } } /// Material ThemeData 커스텀 ThemeData get themeData { return ThemeData( /// Scaffold scaffoldBackgroundColor: state.color.surface, /// AppBar appBarTheme: AppBarTheme( backgroundColor: state.color.surface, elevation: 0, centerTitle: false, iconTheme: IconThemeData( color: state.color.text, ), titleTextStyle: state.typo.headline2.copyWith( color: state.color.text, ), ), /// BottomSheet bottomSheetTheme: const BottomSheetThemeData( backgroundColor: Colors.transparent, constraints: BoxConstraints( maxWidth: Breakpoints.bottomSheet, ), ), ); } }로 변경하면 맞는지요?
-
해결됨[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
select provider 질문있습니다!
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.코드팩토리 디스코드https://bit.ly/3HzRzUMFlutter 강의를 구매하시면 코드팩토리 디스코드 서버 플러터 프리미엄 채널에 들어오실 수 있습니다! 디스코드 서버에 들어오시고 저에게 메세지로 강의를 구매하신 이메일을 보내주시면 프리미엄 채널에 등록해드려요! 프리미엄 채널에 들어오시면 모든 질의응답 최우선으로 답변해드립니다! 강의에 나오는 코드와 동일하다고 생각하는데 SelectProviderScreen을 띄웠을 때 버튼을 눌러서 toggle 메소드들이 실행되게 해도 값이 변경이 안됩니다! ㅠㅠselect_provider_screen.dartclass SelectProviderScreen extends ConsumerWidget { const SelectProviderScreen({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { final state = ref.watch(selectProvider); return DefaultLayout( title: 'SelectProviderScreen', body: SizedBox( width: double.infinity, child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text(state.name), Text(state.isSpicy.toString()), Text(state.hasBought.toString()), ElevatedButton( onPressed: () { ref.read(selectProvider.notifier).toggleIsSpicy(); }, child: Text('Spicy Toggle'), ), ElevatedButton( onPressed: () { ref.read(selectProvider.notifier).toggleHasBought(); }, child: Text('hasBought Toggle'), ), ], ), ), ); } }select_provider.dartimport 'package:advanced_state/model/shopping_item_model.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; final selectProvider = StateNotifierProvider<SelectNotifier, ShoppingItemModel>( (ref) => SelectNotifier(), ); class SelectNotifier extends StateNotifier<ShoppingItemModel> { SelectNotifier() : super( ShoppingItemModel( name: '김치', quantity: 3, hasBought: false, isSpicy: true, ), ); toggleHasBought() { state.copyWith( hasBought: !state.hasBought, ); } toggleIsSpicy() { state.copyWith( isSpicy: !state.isSpicy, ); } }shopping_item_model.dartclass ShoppingItemModel { // 이름 final String name; // 갯수 final int quantity; // 구매했는지 final bool hasBought; // 매운지 final bool isSpicy; ShoppingItemModel({ required this.name, required this.quantity, required this.hasBought, required this.isSpicy, }); ShoppingItemModel copyWith({ //선택한 값만 선택적으로 변경할 수 있게 메소드를 만든다. String? name, int? quantity, bool? hasBought, bool? isSpicy, }) { return ShoppingItemModel( name: name ?? this.name, //name이 null일때는 this.name, null이 아닐때는 입력받은 name이 된다. quantity: quantity ?? this.quantity, hasBought: hasBought ?? this.hasBought, isSpicy: isSpicy ?? this.isSpicy, ); } }어느 부분이 잘못되었을까요...?
-
미해결Flutter 입문 - 안드로이드, iOS 개발을 한 번에 (with Firebase)
종속성 충돌 질문
firebase 관련 패키지 충돌에 관한 주요 공지에서 코드대로 맞춘 다음 flutter pub get을 했는데 firebase_core의 버전을 업그레이드나 firebase_auth의 버전을 다운그레이드하라는 메세지가 떴습니다... 알려준대로 다운그레이드하거나 업그레이드 진행해도 될까요?