묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨Supabase, Next 풀 스택 시작하기 (feat. 슈파베이스 OAuth, nextjs 14)
mac 터미널 설정이 궁금합니다
사용하시는 터미널이랑, 테마, 플러그인 어떤것을 사용하시는지 궁금합니다
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
[문제해결] '오늘도 출첵!' 의 171번 강의에서 중요한 문제를 발견했습니다
강의 따라서 프로젝트를 진행하다가 '출근 가능/불가능 확인 로직'에서 문제를 발견했습니다. 이것저것 시도하다가 드디어 해결해서 과정 공유해봅니다.기존 코드 /// 기존의 initState() @override void initState() { super.initState(); // (아마도) 이 시점에서 오류 발생 ↓ Geolocator.getPositionStream().listen((eventPosition) { // 목적지 위치 var start = defaultLatLng; // 현재 위치 var end = LatLng(eventPosition.latitude, eventPosition.longitude); /// 거리 구하기 var distance = Geolocator.distanceBetween( start.latitude, start.longitude, end.latitude, end.longitude, ); /// 거리가 `boundary` 내부에 들어오는지 확인 setState(() => mayChoolCheck = distance <= boundary); }); } /// 위젯 빌드 @override Widget build(BuildContext context) { /// AppBar: 제목 & 액션 버튼1 var appBar = AppBar( title: Text( '오늘도 출근', style: TextStyle(color: Colors.blue, fontWeight: FontWeight.w700), ), centerTitle: true, // 안드로이드 설정 actions: <Widget>[ /// 원래 위치로 돌아오기 버튼 IconButton( onPressed: returnToMyLocation, icon: Icon(Icons.my_location), color: Colors.blue, ), ], ); return Scaffold( backgroundColor: Colors.white, appBar: appBar, /// 권한 요청을 위한 빌더 body: FutureBuilder<void>( future: checkPermission(), // 위치 권한 묻기 대화상자는 이 시점에 생성됨 builder: (context, snapshot) { if (snapshot.hasError) { return Center(child: Text('${snapshot.error}')); } // 이하 위젯 생성 코드... }, ), ); } /// Future<void> checkPermission() async { /// 위치 서비스 활성화 여부 var isLocationServiceEnabled = await Geolocator.isLocationServiceEnabled(); /// 활성화되지 않았다면 에러 발생 (앱이 현재 위치를 사용할 수 없으므로) assert(isLocationServiceEnabled, '위치 기능을 활성화하지 않았습니다.'); /// 권한 상태 확인 var checkedPermission = await Geolocator.checkPermission(); if (checkedPermission == LocationPermission.denied) { checkedPermission = await Geolocator.requestPermission(); } /// 시뮬레이션 상 `checkedPermission`이 위치 권한 허용 상태가 아니면 에러 유도 assert( checkedPermission == LocationPermission.always || checkedPermission == LocationPermission.whileInUse, '위치 권한을 허용해주세요.', ); }오류 추적오류의 원인은 'User denied permissions .. device's location.' 즉, 사용자가 위치 권한을 아직 허용하지 않은 시점에 위치 권한이 필요한 함수를 호출하려고 함. [ERROR:flutter/runtime/dart_vm_initializer.cc(40)] Unhandled Exception: User denied permissions to access the device's location. E/flutter (13339): #0 GeolocatorAndroid.getPositionStream.<anonymous closure> (package:geolocator_android/src/geolocator_android.dart:201:9) E/flutter (13339): #1 Stream.handleError.<anonymous closure> (dart:async/stream.dart:961:16) E/flutter (13339): #2 HandleErrorStream.handleError (dart:async/stream_pipe.dart:303:17) ...#0 에서 이미 getPositionStream().<anonymous closure> 로 추적한 걸로 보아, Geolocator.getPositionStream() 함수 호출 시점에 오류 발생한 것이 분명함.문제의 원인과 해결책 (일부 ChatGPT의 도움을 받음)문제의 가장 중요한 핵심은, 처음 앱 실행 시 위치 권한 확인 로직이 완전히 끝나기 전에 위치 권한 허용이 이루어지지 않으므로, 앱 재시작 이전까지 '사용자 현재 위치 추적 기능'이 활성화되지 않고, 추가로 관련 함수에서 오류 발생 가능성이 있음.그러므로 checkPermission() 함수는 initState()에서 최초 한 번만 실행하고, Geolocator.getpositionStream() 함수는 따로 분리하여 checkPermission()이 정확히 끝난 시점에 실행되도록 로직을 변경함. 1. checkPermission() 의 리턴 타입을 Future<void> 에서 Future<bool>로 변환 /// 위치 권한 확인 및 부여 함수 Future<bool> checkPermission() async { /// 위치 서비스 활성화 여부 var isLocationServiceEnabled = await Geolocator.isLocationServiceEnabled(); assert(isLocationServiceEnabled, '위치 기능을 활성화하지 않았습니다.'); /// 권한 상태 확인 var checkedPermission = await Geolocator.checkPermission(); if (checkedPermission == LocationPermission.denied) { checkedPermission = await Geolocator.requestPermission(); } /// 위치 권한 허용 여부를 리턴 return checkedPermission == LocationPermission.always || checkedPermission == LocationPermission.whileInUse; }2. initState()에서 checkPermission()과 addSubscription() 함수를 차례로 실행 (.then() 메소드 활용) @override void initState() { super.initState(); checkPermission().then((permitted) { if (permitted) addSubscription(); }); } /// addSubscriptsion 함수 void addSubscription() { /// 리스너 함수: 출근체크 가능 여부 확인하기 Geolocator.getPositionStream().listen((eventPosition) { // 목적지 위치 var start = defaultLatLng; // 현재 위치 var end = LatLng(eventPosition.latitude, eventPosition.longitude); /// 거리 구하기 var distance = Geolocator.distanceBetween( start.latitude, start.longitude, end.latitude, end.longitude, ); /// 거리가 `boundary` 내부에 들어오는지 확인 setState(() => mayChoolCheck = distance <= boundary); }); } 3. 위젯 재빌드 시 FutureBuilder의 future 함수 재호출을 방지하기 위해 비동기 결과를 미리 필드로 빼놓기ChatGPT는 이를 'Cashing Future' 라고 부른다고 함.(이 코드 부분에 중요한 로직이 하나 빠져서 방금 재수정했습니다.)/// 권한 확인 여부 리턴 값 late final Future<bool> permissionFuture; @override void initState() { super.initState(); /// checkPermission()의 결과를 값으로 저장 permissionFuture = checkPermission().then((permitted) { if (permitted) addSubscription(); return permitted; }); } /// 위젯 빌드 @override Widget build(BuildContext context) { /// AppBar: 제목 & 액션 버튼1 var appBar = AppBar(...); return Scaffold( backgroundColor: Colors.white, appBar: appBar, /// 권한 요청을 위한 빌더 body: FutureBuilder<bool>( future: permissionFuture, builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.waiting || !snapshot.hasData) { return ColoredBox( color: Colors.blue, child: Center(child: CircularProgressIndicator()), ); } /// snapshot.data가 false 값인 경우는 사용자가 위치 권한 요청을 거부했을 때 if (snapshot.hasError || snapshot.data! == false) { return Center(child: Text('위치 권한을 허용해주세요.\n${snapshot.error}')); } /// 이하 위젯 생성 코드 ... }, ), ); } 이렇게 했을 때 앱 삭제 후 다시 빌드 했을 때, 그리고 재시작 했을 때도 정상적으로 잘 작동했습니다.코드가 많이 훼손된 느낌도 들긴 하지만.. 나름대로 공부가 돼서 기분은 좋네요.주저리주저리 쓰느라 정신 없었는데.. 잘 이해가 안 되거나 하고 싶은 피드백이 있다면 꼭 말씀해주세요!아무쪼록 끝까지 읽어주셔서 감사합니다.
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
StatefulWidget 실습 에러가 발생합니다.[해결완료]
코드팩토리 디스코드에 질문하면 더욱 빠르게 질문을 받아 볼 수 있습니다![코드팩토리 디스코드]https://bit.ly/3HzRzUM - 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.오타가 있었네요 ^^;;해결 되었습니다. 안녕하세요.StatefulWidget 생성해보기 강의의 코드를 그대로 작성했는데요. 첨부 사진과 같은 에러가 발생합니다.코드 이상은 없는듯 한데, 저장하니 에러가 발생합니다.
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
Video Player 프로젝트에 대한 추가 질문
선생님 강의 너무 잘 듣고 있습니다.video_player 프로젝트 관련 내용 모두 확인했고, 여기에 하나만 간단하게 비디오에서 나가기 버튼을 추가해보았습니다. 일단 제가 작성해본 코드부터 공유하겠습니다.테스트 상 로고화면으로는 잘 돌아갑니다. _VideoPlayerState의 dispose() 함수도 정상적으로 실행돼요. 다만 로직이 실제 앱에서 실행되어도 충분히 괜찮은 로직일지, 혹은 더 안전한 방법이나 기타 필요한 수정사항이 있다면 알려주시면 감사하겠습니다. _HomeScreenState 내부class _HomeScreenState extends State<HomeScreen> { // bool showVideo = false; XFile? video; @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.black87, body: video == null ? _VideoSelector(onLogoTap: openPicker) : _VideoPlayer( video: video!, onImageIconPressed: openPicker, onExitIconPressed: exitPlayer, // 나가기 버튼 함수 ), ); } void openPicker() async { // setState(() => showVideo = true); /// ImageSource.gallary: 사진 앱에 저장된 이미지/비디오 파일 선택 /// ImageSource.camera: 디바이스가 즉시 촬영한 이미지/비디오 파일 선택 const source = ImageSource.gallery; /// pickVideo(): 사용자 비디오 파일을 선택 final picked = await ImagePicker().pickVideo(source: source); // print(picked); setState(() => video = picked); } /// ↓↓ 여기에 비디오에서 나가기 로직 추가 void exitPlayer() { setState(() { // print('info: exitIconButton 클릭'); video = null; }); } } _VideoPlayerState 내부class _VideoPlayerState extends State<_VideoPlayer> { late VideoPlayerController _videoPlayerController; bool showButton = true; // ... /// 위젯 상태 제거 @override void dispose() { _videoPlayerController.dispose(); print('info: 비디오 플레이어 종료 중..'); super.dispose(); } @override Widget build(BuildContext context) { final VideoPlayerValue videoPlayer = _videoPlayerController.value; // final position = videoPlayer.position; // final duration = videoPlayer.duration; return Center( child: AspectRatio( aspectRatio: videoPlayer.aspectRatio, child: GestureDetector( onTap: () => setState(() => showButton = !showButton), child: Stack( children: <Widget>[ VideoPlayer(_videoPlayerController), /// 영상 화면 커버 if (showButton) Container( width: double.infinity, height: double.infinity, color: Colors.black.withAlpha(128), ), /// 재생/중지와 뒤로&앞으로 버튼 if (showButton) _PlayButton( isPlaying: videoPlayer.isPlaying, onReversePressed: onReversePressed, onPlayPressed: onPlayPressed, onForwardPressed: onForwardPressed, ), /// 하단 슬라이더 if (showButton) _BottomSlider( position: videoPlayer.position, duration: videoPlayer.duration, onSliderMoved: onSliderMoved, ), /// 화면 상단 버튼 if (showButton) _TopButtons( // ← 여기를 2개의 버튼으로 확장 onExitPressed: widget.onExitIconPressed, onImagePressed: widget.onImageIconPressed, ), ], ), ), ), ); } _TopButtons 내부class _TopButtons extends StatelessWidget { final VoidCallback onImagePressed; final VoidCallback onExitPressed; const _TopButtons({ required this.onExitPressed, required this.onImagePressed, }); @override Widget build(BuildContext context) { return Positioned( left: 4, right: 4, top: 0, // Row로 감싸고 왼쪽에 '나가기' 버튼 추가 child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: <IconButton>[ // 나가기 버튼 IconButton( onPressed: onExitPressed, icon: Icon(Icons.chevron_left, color: Colors.white), ), // 다른 영상 선택 버튼 IconButton( onPressed: onImagePressed, icon: Icon(Icons.photo_camera_back, color: Colors.white), ), ], ), ); } }
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
Row위젯이나 column위젯의 위치는 누가 정하나요??
Row위젯이나 column위젯의 위치는 누가 정하나요?? Container위젯은 자식위젯의 위치를 정하지 않는다고 하셨는데 오늘 코드를 보면 부모위젯을 container로 가지는 row위젯은 container위젯의 가로방향에 대해 중앙에 위치하지 않나요?? 이 위치는 누가 정한 간가요??그리고 column row는 항상 부모위젯에 대해 중앙에 위치하나요??
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
geolocator 오류때문에 개발진행이 불가능입니다
코드팩토리 디스코드에 질문하면 더욱 빠르게 질문을 받아 볼 수 있습니다![코드팩토리 디스코드]https://bit.ly/3HzRzUM안녕하세요 geolocator강의 시청 후 화면에 현재 제가 위치한 gps 위치를 띄우려고 했는데 아래와 같은 오류가 떠서 며칠째 해결을 못하고 있습니다. geolocator관련 기능을 아예 사용하지 못하여 개발에 진행이 안되는 상황입니다! gps는 애뮬레이터 내부에 위치 설정은 해준 상태입니다... 어떻게 해결하면 되는지 원격요청 드려봅니다!+왜인지 geolocator_android-5.0.2가 계속적으로 선택됩니다.. - 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
API 관련 이슈
코드팩토리 디스코드에 질문하면 더욱 빠르게 질문을 받아 볼 수 있습니다![코드팩토리 디스코드]https://bit.ly/3HzRzUM 안녕하세요. 미세먼지 강의 듣는 중인데 9월에 발생한 대전 국정자원 관리원 화재의 여파로 10월 22일부터 공공데이터 포털 내에 일부 api 기능이 정상적으로 동작하지 않는 상태이며, 언제 해결될지 알 수 없는 상태라고 합니다. api 호출 없이 강의를 진행해도 될지 문의 드립니다.
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
VoidCallback 뒤에 null 연산자 표기에 관한 질문
null 연산자 표기에 관해 의문사항이 생겼습니다.U&I 에서는 iconButton에 정의에 아래와 같이 적혀 있어 VoidCallback 뒤에 null 연산자를 표기하는 것으로 이해했습니다. required void Function()? onPressed,ElevatedButton 역시 위와 같이 정의되어 있지만 이번 강의에서는 표기가 안되있어서 기존에 작성했던 U&I 코드로 가 null 연산자를 제거해보니 정상적으로 동작하는 것을 확인했습니다.null 연산자 관련 에러 로그가 없다면 표시를 생략해도 되는 것인지, 아니면 이와 상관없이 위젯 정의에 명시된대로 표기하는것이 권장사항인지 의문이 들어 질문드립니다.
-
해결됨[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
toList() 코드가 사라진 이유에 관한 질문
Section19 String 스플릿하기 중 강의 중간에 작성하신 (6분 23~26초 경) .toList()가 코드 포메터에 의해 사라진 것처럼 보입니다.해당 toList()가 사라진 것은 iterable에도 map을 사용할 수 있어서 굳이 toList()로 바꿔줄 필요가 없기 때문일까요? 아니면 다른 이유가 있을까요?
-
해결됨[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
에뮬레이터와 시뮬레이터 동시 실행 관련 문의드려요
안드로이드 에뮬레이터와 ios 시뮬레이터를 동시 실행한 후 핫 리로드를 했을 때 두 기기에 모두 반영이 되도록 하는 방법이 있을까요?
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
map 함수 쓸때 왜 $e를 사용하는 지 모르겠습니다. 그냥 e를 써도 되는 것 아닌가요??
제목 그대로 입니다. map 함수 쓸때 왜 $e를 사용하는 지 모르겠습니다. 그냥 e를 써도 되는 것 아닌가요??
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
설명이 너무 헷갈립니다.
왜 자꾸 안가르쳐주신 부분을 당연한 듯이 쓰시는 지 모르겠습니다…ㅜㅜ 그 전전 강의까지만해도 color를 red blue로 변경하는 부분을 다 if문을 사용하여 작성하셨는데 갑자기 show =show == true ? false : true 를 설명 안하시고 사용하시는데 너무 헷갈립니다. 솔직히 다트 언어 배울때도 니중에 설명하신다고 하고 나중에는 다시 이전에 배웠죠 이런식으로 하시는데 너무 헷갈립니다.
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
CodeFactoryWidget이 StatefulWidget인 이유에 대해서
안녕하세요?초보자라서 질문을 어떻게 해야될지 모르겠어서 횡설수설인 점 미리 죄송합니다. 세번째 라이프사이클을 설명하실 때 사용하신 코드에 대해서 질문이 있습니다.홈스크린 위젯을 StatefulWidget해서 클래스를 2개 만드는것은 변하는 화면을 보여주기 위해서 사용한것이겠죠? 그런데 CodeFactoryWidget은 버튼을 보여주는 위젯인데 왜 StatefulWidget을 상속받아 만드신 것일까요?CodeFactoryWidget은 상태를 관리하지 않으므로 StatelessWidget을 상속받아도 되지 않을까요? 궁금해서 잠이 오지 않습니다.
-
해결됨Supabase, Next 풀 스택 시작하기 (feat. 슈파베이스 OAuth, nextjs 14)
DBeaver와 supabase connection
host, port, username, password 다 제대로 적었는데, test connection을 하려고 하면"no route to host"라고 뜹니다.구글링 해봐도 해결이 안되네요.이런 오류가 뜰 때는 보통 어떻게 해결하나요??
-
해결됨Claude + IntelliJ로 TodoList 개발하기 - MCP 완전 정복
spring initializr generate문의
1강 2:59 와 3:56 같은 내용인가요? 중복되는 것 같은데요. demo를 두 번 만드시는건지 헷갈립니다.
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
리포맷 코드
코드팩토리 디스코드에 질문하면 더욱 빠르게 질문을 받아 볼 수 있습니다![코드팩토리 디스코드]https://bit.ly/3HzRzUM 리포맷 코드 단축키를 누르니까 갑자기 ,들이 사라져서 한줄로 코드가 바껴요.갑자기 그러는데 어떻게 고쳐야 하나요?
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
칼럼위젯을 감싸는 컨테이너위젯을 확장시켰는데 왜 칼럼위젯도 커지는지 궁금합니다.
Column 위젯을 crossaxisalignment 방향으로 확장하고 싶을 때 column위젯의 상위 위젯인 container 위젯에 width: double.infinity를 사용한다고 하셨습니다. 그런데 궁금한 점은 column위젯과 container위젯은 별개의 위젯인데 container위젯을 확장하면 column위젯도 왜 확장되는 지 모르겠습니다.그래서 제가 생각한 방법은 column위젯에 crossAxissize: CrossAxisSize.Max위젯을 넣으면 column이 커지니까 column을 감싸는 container도 당연히 커지는 게 맞다고 생각합니다.
-
미해결Supabase, Next 풀 스택 시작하기 (feat. 슈파베이스 OAuth, nextjs 14)
가상환경 같은건 없나요?
안녕하세요리액트나 NextJS는 익숙하지 않아 질문드립니다.파이썬을 쓸때는 가상환경을 만들어서 프로젝트 마다 관리를 하는데 NextJS는 각 프로젝트 폴더마다 관리가 되나요?이것저것 하다가 실수하면 다 지우고 처음부터 다시 하는편이라서 파이썬 가상환경이 너무 마음에 들었는데 혹시 NextJS도 가능한가 궁금합니다.잘 모르기 때문에 실수해서 패키지가 엉망이 된 경우가 많아서 걱정부터 되네요.다들 기본적으로 잘하셔서 그런가 보통 강의를 들을때 이런 부분은 잘 안물어보시나봐요.
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
그냥 const라는 변수에 리스트를 선언해도 괜찮나요??
Color들의 리스트를 colors로 만드셨는데 원래 리스트 선언할때는 List<widget> colors = [Colors.red,Colors.orange,••• 이런식으로 선언해야하지 않나요?? 그냥 const라는 변수에 리스트를 선언해도 괜찮나요??
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
ParsedPeople.where((x)=>x.group==‘BTS’); 에서 x가 어떻게 person 클래스의 Instance인가
parsedpeople은 people을 class에 파라미터값을 대입한 값들을 return값으로 가지는 list입니다. 즉, parsedpeople 리스트는 각 성분을 [person(name:지수,group:블랙핑크),person(name:로제,group:블랙핑크)•••]과 같은 형태인데 여기서 where함수를 취하면 그 각 x값들은 person(name:지수,group:블랙핑크) 을 가지는 것 아닌가요?? 강사님이 설명하신 것처럼 x가 인스턴스 이려면 이전에 설정한 person클래스의 person인스턴스를 사용해야하는 것 아닌가요?? class강의에서는 class의 변수를 사용하려면 인스턴스 만들어서 tt.Numbers와 같이 사용했습니다. 그런데 갑자기 어떻게 사용하셨는지 설명이 브족합니다