묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
BottomNavigationBar 질문
검색 방법이 잘못된건지 모르지만 구글에 검색해도 해결법이 나오지않아 질문 올립니다. bottomNavagtionBar: GestureDetector( onTap: (){ Navigator.push(context, MaterialPageRoute(builder: (context) => CommentRegisterScreen( id: widget.id))); }, child: TRoundedContainer( height: 60, backgroundColor: const Color(0xffF8F8FA), padding: const EdgeInsets.all(TSizes.defalutSpace), radius: 0, child: Text( '댓글을 남겨보세요.', style: Theme.of(context).textTheme.bodyMedium!.copyWith(color: Colors.grey), ), ), ), child: SingleChildScrollView( child: Padding( padding: const EdgeInsets.all(TSizes.defalutSpace), child: Column( children: [ const SizedBox(height: TSizes.spaceBtwItems), SizedBox( height: MediaQuery.of(context).size.height, child: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ Expanded( child: PaginationListViewV2( model: state, id: widget.id, provider: commentProvider(widget.id), itemBuilder: <Comment>(_,index,comment){ if(index == 0){ return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ /// 제목 Text(state.title, style: Theme.of(context).textTheme.headlineMedium), const SizedBox(height: TSizes.spaceBtwItems), /// 닉네임 Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ const TRoundedImage( width: 24, height: 24, fit: BoxFit.fill, imageUrl: 'asset/img/no_image.png', borderRadius: 100, ), const SizedBox(width: TSizes.sm), Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( state.creator, style: Theme.of(context).textTheme.bodyLarge, ), ], ), ], ), const SizedBox(height: TSizes.spaceBtwItems), /// 날짜, 좋아요 Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( state.createDate.split("T")[0], style: Theme.of(context).textTheme.bodyMedium!.copyWith(color: Colors.grey), ), GestureDetector( onTap: button.disable==false ? () async { //버튼 비활성화 await button.change(); await check == -1 ? ref.read(communityProvider.notifier).clickFavorite(widget.id) : ref.read(communityProvider.notifier).downFavorite(widget.id); await ref.read(favoriteProvider.notifier).updateFavorites(widget.id); //버튼 활성화 await button.change(); } : null, child: check == -1 ? TRoundedContainer( showBorder: true, padding: const EdgeInsets.all(TSizes.sm), borderColor: Colors.redAccent, radius: 10, child: Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ Text( '좋아요', style: Theme.of(context).textTheme.labelMedium!.copyWith(color: Colors.redAccent), ), const SizedBox(width: TSizes.xs), Text( state.favorite.toString(), style: Theme.of(context).textTheme.labelMedium!.copyWith(color: Colors.redAccent), ), ], ), ) : TRoundedContainer( padding: const EdgeInsets.all(TSizes.sm), backgroundColor: Colors.redAccent, radius: 10, child: Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ child: SizedBox( height: 120, child: ListView.separated( shrinkWrap: true, scrollDirection: Axis.horizontal, itemCount: imgs.length, separatorBuilder: (_, __) { return const SizedBox(width: TSizes.spaceBtwItems / 2); }, itemBuilder: (_, int index) { return TRoundedImage( imageUrl: imgs[index].toString().trim(), width: 120, height: 120, fit: BoxFit.fill, borderRadius: 12.0, isNetworkImage: true, ); }, ), ), ), ], ) : const SizedBox(), const SizedBox(height: TSizes.spaceBtwSections), /// 글 내용 Text( state.content.trim(), style: Theme.of(context).textTheme.bodyMedium!.copyWith(height: 1.5), ), /// 댓글 0이 아닐 경우 Row( children: [ Text('댓글', style: Theme.of(context).textTheme.bodySmall), const SizedBox(width: TSizes.spaceBtwItems / 2), Text(state.commentCnt.toString(), style: Theme.of(context).textTheme.bodySmall), ], ), const SizedBox(height: TSizes.spaceBtwItems), CommentCard( comment:comment, recomments:comment.commentList, board_id: widget.id ) ], ); } return CommentCard( comment:comment, recomments:comment.commentList, board_id: widget.id ); }), ), Container( height: 210 ) ] ), ), // Center(child: Text('첫 댓글을 남겨주세요.', style: Theme.of(context).textTheme.bodySmall)), ], ), ), ),위 코드와 같이 BottomNavigationBar와 SinglechildScrollView를 같이 사용하고 있습니다. 가장 하단의Container( height: 210 )위 코드를 넣어주지 않을 시 화면 스크롤이 모두 안되고 짤리는 현상이 발생합니다. 혹시 이러한 경험이 있어 해결방법이 있다면 알려주시면 감사하겠습니다.
-
해결됨[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
플러터 내 생성 시 file / directory의 차이
플러터 내 생성 시 file / directory의 차이가 궁금합니다. 어떨 때는 New에서 file을 생성하고 어떨 때는 directory를 생성해서요~
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
toolchanin 에러가 발생합니다.
Android toolchain - develop for Android devices X Unable to locate Android SDK. Install Android Studio from: https://developer.android.com/studio/index.html On first launch it will assist you in installing the Android SDK components. (or visit https://flutter.dev/docs/get-started/install/windows#android-setup for detailed instructions). If the Android SDK has been installed to a custom location, please use flutter config --android-sdk to update to that location. Android SDK is up to date.Running Android Emulator hypervisor driver installer[SC] ControlService 실패 1062:서비스가 시작되지 않았습니다.[SC] DeleteService 성공[SC] 4294967201 오류가 발생하여 StartService이(가) 실패했습니다.Done 이런 오류는 어떻게 해결하나요?
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
다시 getDetail호출?
제 생각이 조금이라도 이상한 곳이 있다면 말씀해주세요 ~! ㅎㅎ첫번째 질문은 , detail_screen.dart에서initState에 ref.read(restaurantProvider.notifier).getDetail(id: widget.id); 만 사용하였는데만약 restaurantDetailModel이 이미 있는 id를 또 getDetail한 거였다면, 다시 getDatil을 호출할 필요가 없으므로이떄 initState에 ref.read(restaurantDetailProvider) is restaurantDetailModel 라면 getDatil을 호출하지 않겠다를추가로 넣으면 좋겠다 생각하는데 제 생각이 어떠한가요?? 두번째 질문은 restaurant > provider > restaurant_provider.dart 에서 네트워크 요청을 하다가 등등 에러가 날수 있을 거 같은데 여기는 catch 로 잡아서 state를 왜 error로 만들지 않았나 궁금합니다..!
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
initState -> didChangeDependencies -> dirty -> build -> clean 라이프사이클 강의를 보고 궁금한건데
내용은 전반적으로 이해가 됩니다.질문내용은 print로 찍어봐서 라이프사이클은 initState -> build -> initState타이머만 작동하는거를 알 수 있었는데initState에서 build로 갔으면 타이머가 작동을 어떻게 하나요?initState에서 build로 가고 clean 후 deactivate로 안가고 initState 타이머로 가는 원리가 궁금합니다.제가 머릿속으로 생각해봤을때는 initState 시작 후 마치 반복문 무한루프처럼 build로 갈 수 없고 계속 타이머 돌아가지 않나 싶어서요
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
섹션22 동영상플레이어에서 로고 클릭시 오류 발생합니다.
IOS 시뮬레이터 사용하여 로고 클릭시Lost connection to device.Error: Unable to terminate com.example.vidPlayer on 6913EF1F-C2DE-4C17-A1F2-7948E943B273:ProcessException: Process exited abnormally with exit code 3:An error was encountered processing the command (domain=NSPOSIXErrorDomain, code=3):Simulator device failed to terminate com.example.vidPlayer.found nothing to terminateUnderlying error (domain=NSPOSIXErrorDomain, code=3): The request to terminate "com.example.vidPlayer" failed. found nothing to terminate found nothing to terminate Command: /usr/bin/arch -arm64e xcrun simctl terminate 6913EF1F-C2DE-4C17-A1F2-7948E943B273 com.example.vidPlayerthe Dart compiler exited unexpectedly. 오류가 뜨면서 어플 밖으로 나가버리네요. 해결방법 알 수 있을까요?
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
데이터가 List형태일때 질문해 봅니다.
안녕하세요. 제가 질문을 잘못했던거 같습니다.데이터가 Map형태가 아니고 List형태일때 CursorPagination을 사용할 수 있나요?목적은 CursorPaginationBase를 extends 하고 싶어서 입니다. 된다면 CursorPagination을 어떻게 구성해야 하는지 힌트를 좀 주실 수 있을까요?아니면 보통 데이터를 Map 형태로 고쳐서 사용하나요?아니면 제가 잘못이해한걸까요?데이터가 meta나 data안에 있어야 하는게 Map형태라고 생각했는데 그게 아니고List형태도 key와 value로 나누면 Map형태가 되는건가요?
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
세션 29 isar database open error
안녕하세요.Unique Constraint 테스트하기 강의에서 izar database를 main 함수 내에서 여는 코드에서 에러가 나서 진행이 되지 않고 있습니다,, main.dartimport 'package:dusty_dust/model/stat_model.dart'; import 'package:dusty_dust/screen/home_screen.dart'; import 'package:flutter/material.dart'; import 'package:isar/isar.dart'; import 'package:path_provider/path_provider.dart'; void main() async { //main 함수에서 runApp말고 다른 거 실행하려면 이걸 적어줘야함. WidgetsFlutterBinding.ensureInitialized(); final dir = await getApplicationDocumentsDirectory(); final isar = await Isar.open( [StatModelSchema], directory: dir.path, ); runApp( MaterialApp( theme: ThemeData( fontFamily: 'sunflower' ), home: HomeScreen(), )); } pubspec.yamlcupertino_icons: ^1.0.2 dio: ^5.4.3+1 isar: ^3.1.0+1 isar_flutter_libs: ^3.1.0+1 path_provider: ^2.1.2 isar_generator: ^3.1.0+1 Error MessageE/flutter ( 364): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: MissingPluginException(No implementation found for method getApplicationDocumentsDirectory on channel plugins.flutter.io/path_provider)E/flutter ( 364): #0 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:332:7)E/flutter ( 364): <asynchronous suspension>E/flutter ( 364): #1 getApplicationDocumentsDirectory (package:path_provider/path_provider.dart:121:24)E/flutter ( 364): <asynchronous suspension>E/flutter ( 364): #2 main (package:dusty_dust/main.dart:11:15)E/flutter ( 364): <asynchronous suspension>E/flutter ( 364):
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
스크롤의 maxScrollExtent 관련 문의
안녕하세요 저도 완성된 pagination 로직 실행해보기 강의에서 스크롤 리스너의 if문 조건이 적용되지 않아서 문의 드립니다. 저는 구현된 코드를 확인했을때 maxScrollExtent 값이 엄청 크게 나옵니다.그래서 같은 리스트를 세번 정도는 반복 스크롤을 해야 컨트롤러의 offset이 maxScrollExtent와 동일해집니다. 최초 리스너 동작 시 scroll 위치 : 6.6650390625maxScrollExtent : 7485.526283048211 확인해본 사항은 아래와 같습니다. item 중복 저장 여부 : 최초 로딩 후 데이터 사이즈를 확인했을때도 사이즈는 20개 입니다. 리스트뷰 구현 오류인지 확인 : 컨트롤러를 빼고 테스트하면, 20개 크기 그대로 리스트뷰가 생성됩니다. 사이즈가 안먹히는 것 같아서 픽셀 위치 대신 데이터 갯수를 index로 관리해서 해보려고 했는데, 정확히 맞는 방법인지도 모르겠어서 문의드립니다. T_T...어딘가 단단히 잘못된 것 같은데 모르겠습니다...
-
해결됨[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
dio요청시 에러 상태코드임에도 onError가 아닌 onReponse에서 응답
flutter: [REQ] [METHOD] GET [ENDPOINT] http://localhost:8080/api/user/info flutter: [RES] [METHOD] GET [ENDPOINT] http://localhost:8080/api/user/info [STATUS CODE] 401현재 제가 진행 중인 프로젝트에서 401 코드임에도 불구하고 onError가 아닌 onReponse로 넘어갑니다. 액세스 토큰 재발급 과정을 onResponse에서 진행해도 되는걸까요? throw new InvalidVerificationCodeException(ErrorCode.INVALID_CODE); }백엔드에서 이렇게 에러를 내주는 onResponse로 넘어오네요..
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
widget.color 가 헷갈립니다.
안녕하세요! widget.color가 동작 방식이 이해가 가질 않습니다. ㅜ stateful 클래스와 state 클래스를 바인딩 시켜주면 widget.color의 state클래스에서 widget은 stateful클래스를 참조한다고 생각하면 될까요?
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
checkToken 함수 read 에러 관련 질문
안녕하세요.iOS 시뮬레이터로 개발중입니다.checkToken 함수 실행 시 Unhandled Exception: PlatformException(Unexpected security result code, Code: -25300, Message: The specified item could not be found in the keychain., -25300, null) 에러가 발생하여 질문드립니다. 값이 없을 경우 nullable string이 나와야 하는데 exception이 나오는 이유가 궁금해요. 혹시 몰라서 write를 먼저 하고 read를 했더니 값이 잘 불러와집니다.
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
PageController 를 statelesswidget 에서 사용하면
해당 pageview를 stateful에서 구현하라고 힌트 주셨는데 .controller와 timer를 @dispose 처리해야해서 인가요? 일단 성미가 급해서 힌트 안듣고 ㅋㅋ stateless에서 구현하고 나니 ful로 하라시길래 "아 이유를 설명해주시겠지" 했는데 잘 이해를 못했어요 ㅠㅠ
-
해결됨Flutter로 SNS 앱 만들기
섹션 2 회원가입화면
예상하지 않게 안드로이드와 플러터 업 하면서 에러로 인하여 섹션 2에 이름,패스원드 확인 검징로직작성편을 다시 보고 있습니다.그런데, 검증로직에서 에러 부분에 색상이 흰색으로 나와요.강의화면처럼 빨강색으로 나오고 싶은데 어떻게 하면 됩니까validator: (value) {if (value == null ||value.trim().isEmpty ||!isEmail(value.trim())) {return '이메일을 입력해주세요';
-
해결됨Flutter로 SNS 앱 만들기
섹션 8 - Follow, Unfollow 기능 추가 파트에서 UserState에서 UserModel을 얻어지지가 않습니다.
문제가 되는 것으로 추정되는 코드는 UserModel currentUserModel = context.read<UserState>().userModel;입니다.이전 강의인 '특정 사용자의 정보 표시' 에서부터 문제가 발생했는데, 이번 강의에서 그냥 지우시길래 일단 넘어갔었습니다.그러나, 이번 강의에서 똑같이 UserState에서 userModel을 얻어오려고 하니, 실제로는 값이 저장되지 않았습니다.user_state.dart와 user_model.dart를 올려놓으신 Github 최종 코드로 그대로 복사해봤으나, 별다른 효과는 없었습니다...어떻게 해야할 지 모르겠습니다. 의견 부탁드립니다. userModel에는 값이 저장되었으나, currentUserModel에는 저장되지 않은 모습 메일에 프로젝트 파일을 첨부하여 보내겠습니다. 감사합니다.
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
VideoPlayer 강의에서 file 이 에러가 생기는데 왜일까요?;;;
file 에러가 뜨는데 이유를 모르겠습니다 ;;
-
해결됨Flutter로 SNS 앱 만들기
섹션 7 - 게시글 목록 화면 - 게시글 정보 가져오기에서 Logger에 아무것도 출력되지 않습니다...
커뮤니티에서 저랑 비슷한 증상을 보이는 2분의 질문을 봤습니다. FeedModel도 createAt으로 되어 있었습니다. 에뮬레이터를 수차례 삭제해보고, 재설치를 반복했습니다만 아무것도 찍히지 않았습니다.사용하는 에뮬레이터는 Pixel 8 API 34였고, 실제 안드로이드 14인 갤럭시 S21+ 에도 연결해서 테스트해봤으나, 똑같은 상황이 발생했습니다.코드는 아마 이메일로 보내면 되는 것 같아 이메일로 첨부하겠습니다!
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
에러가 생기네요 - 미세먼지앱 섹션57-19 부터 입니다.
에러가 생기네요 - 미세먼지앱 섹션57-19 부터 인데에러가 생기네요 - 미세먼지앱 섹션57-19 부터 인데, 구판 섹션26-19 입니다.수시로 에러 생기고 가끔 수십번에 1번은 데이터가 들어오는데 그것도 조금 지나면 에러 메세지가 나오네요.첨부파일 참조아마 오타 일건데 암만 강의하구 비교해도 오타를 찾지를 못하겠습니다.포기하구 강의따라가도 20, 21 에서도 계속 에러 나와서 강의 포기하구 있다가 연락드립니다.코드는 첨부 합니다./// component/main_app_bar.dart /// import 'package:flutter/material.dart'; import 'package:section26_fine_dust/constant/color.dart'; import 'package:section26_fine_dust/model/stat_model.dart'; import 'package:section26_fine_dust/model/status_model.dart'; class MainAppBar extends StatelessWidget { final StatusModel status; final StatModel stat; MainAppBar({ required this.status, required this.stat, super.key, }); @override Widget build(BuildContext context) { final ts = TextStyle( color: Colors.white, fontSize: 30.0, ); return SliverAppBar( backgroundColor: status.primaryColor, expandedHeight: 500, flexibleSpace: FlexibleSpaceBar( background: SafeArea( child: Container( margin: EdgeInsets.only(top: kToolbarHeight), child: Column( children: [ Text( '서을', style: ts.copyWith( fontSize: 40.0, fontWeight: FontWeight.w700, ), ), // const SizedBox(height: 20.0), Text( getTimeFromDateTime(dateTime: stat.dataTime), style: ts.copyWith( fontSize: 20.0, ), ), const SizedBox(height: 20.0), Image.asset( status.imagePath, width: MediaQuery.of(context).size.width / 2, ), const SizedBox(height: 20.0), Text( status.label, style: ts.copyWith( fontSize: 40.0, fontWeight: FontWeight.w700, ), ), const SizedBox(height: 8.0), Text( status.comment, style: ts.copyWith( fontSize: 20.0, fontWeight: FontWeight.w700, ), ), ], ), ), ), ), ); } String getTimeFromDateTime({required DateTime dateTime}) { return '${dateTime.year} ${dateTime.month} ${dateTime.day} ${dateTime.hour} ${dateTime.minute}'; } String getTimeFormat(int number) { return number.toString().padLeft(2, '0'); } } /// screen/home_screen.dart /// import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:section26_fine_dust/component/card_title.dart'; import 'package:section26_fine_dust/component/category_card.dart'; import 'package:section26_fine_dust/component/hourly_card.dart'; import 'package:section26_fine_dust/component/main_app_bar.dart'; import 'package:section26_fine_dust/component/main_card.dart'; import 'package:section26_fine_dust/component/main_drawer.dart'; import 'package:section26_fine_dust/component/main_state.dart'; import 'package:section26_fine_dust/constant/color.dart'; import 'package:section26_fine_dust/constant/status_level.dart'; import 'package:section26_fine_dust/model/stat_model.dart'; import 'package:section26_fine_dust/repository/stat_repository.dart'; import '../constant/data.dart'; class HomeScreen extends StatefulWidget { const HomeScreen({super.key}); @override State<HomeScreen> createState() => _HomeScreenState(); } class _HomeScreenState extends State<HomeScreen> { Future<List<StatModel>> fetchData() async { final statModels = await StatRepository.fetchData(); print(statModels); return statModels; } @override Widget build(BuildContext context) { return Scaffold( backgroundColor: primaryColor, drawer: MainDrawer(), body: FutureBuilder<List<StatModel>>( future: fetchData(), builder: (context, snapshot) { if (snapshot.hasError) { // 에러가 있을때 return Center( child: Text('에러가 있습니다.'), ); } if (!snapshot.hasData) { // 로딩 상태 return Center( child: CircularProgressIndicator(), ); } List<StatModel> stats = snapshot.data!; StatModel recentStat = stats[0]; // 1 - 5, 6 - 10, 11 - 15 // 7 final status = statusLevel .where( (element) => element.minFineDust < recentStat.seoul, ) .last; return CustomScrollView( slivers: [ MainAppBar( stat: recentStat, status: status, ), SliverToBoxAdapter( child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ CategoryCard(), const SizedBox(height: 16.0), HourlyCard(), ], ), ), ], ); }, ), ); } }
-
해결됨[플러터플로우] 실전! 앱 출시를 위한 끝장 노하우!
[문의드립니다] supabase에서 제공하는 kakao Auth Providers를 활용하여 인증을 구현을 어떻게 진행하면 되는지요?
요셉님께.. 강의 잘 듣고 있습니다. 질문을 드립니다. Supabase 의 Auth Providers 에서 Kakao를 제공해주는데요..이를 활성화해서 로그인을 구현하고자 하려면 어떻게 해야 할런지요?
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
restaurant_repository.g.dart 파일에서 에러가 나옵니다.
g dart 파일을 생성하면 final value = RestaurantDetailModel.fromJson(_result.data!); 여기서 에러가 발생합니다.