묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
토큰 재발급 관련 질문입니다.
안녕하세요. 기초를 수강하고, 중급 강의 절반 정도 수강한 학생입니다. 우선, 기초와 중급 모두 좋은 퀄리티의 영상과 강의를 올려주셔서 정말 감사드린다는 말씀 드립니다!현재 강의와는 별개로 따로 진행하고 있는 프로젝트에서 한 페이지에 여러 api 호출을 진행하는 과정에서 access 토큰이 만료되었을 때의 상황에서 문제를 겪고 있습니다.예를 들어, 3개의 api를 호출하여 FutureBuilder 3개 혹은 Future.wait으로 3개의 데이터를 가져오는 상황입니다.우선, 모든 요청에 access 토큰 만료를 백엔드에서 계산하고 있습니다. 만료가 되었을 때, 프론트로 401이 던져지고 onError에서 이를 캐치하여 재발급 api를 호출하고 다시 토큰을 갱신하여 secure storage에 저장하고 있습니다.(백엔드에서는 access 토큰이 만료되어 재발급 요청을 받으면, 유효한 refresh 토큰인지 확인하여 유효시 두 토큰 모두 갱신하여 재발급해줍니다.)이 과정에서 3개의 모든 api 요청에 대한 재발급을 시도하여 3번의 재발급 요청이 이루어지게 됩니다. 그리고나서 3개의 모든 api 요청에 다시 resolve를 하게 되는데, 이러한 순서의 로직이 맞는 부분인지 궁금합니다.어려움을 겪고 있는 부분에는 3개의 요청 중 2개의 요청은 요청된 시간이 밀리세컨드 단위로 다르지만, 재발급 된 토큰이 동일해 요청이 성공적으로 진행됩니다. (5개라면 2개가 성공할 때가 있고, 3개가 성공할 때가 있고 시시각각 변합니다..) 하지만, 남은 api 요청은 앞선 요청에서 이미 새롭게 토큰이 발급되었기 때문에 갱신되지 않은 토큰으로 요청을 보내게 되고, 서버에서는 토큰이 새로 갱신되었기 때문에 토큰이 유효하지 않다는 오류가 발생하게 됩니다. 여러 레퍼런스를 참고하여 QueuedInterceptorsWrapper 및 일부 코드를 추가하여 임시로 해결해놓은 상태이지만, 근본적인 원인 해결이 되지 않았다고 생각하여 질문드립니다.(여전히 5개의 요청이라면, 5개의 재발급 요청을 보내는 상황입니다...)아직 남은 강의를 모두 들어보지 않아 해결하지 못하는 문제일 수 있지만, 미리 질문부터 드리는 점 양해 드립니다,,ㅠ서둘러 완강해보도록 하겠습니다!감사합니다 :)
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
Map 함수로 실전적용!
final numbers = [123, 456, 789];print(numbers.map((x) => x.toString().split('').map((y) => '$y.jpg',).toList(),),([1.jpg, 2.jpg, 3.jpg], [4.jpg, 5.jpg, 6.jpg], [7.jpg, 8.jpg, 9.jpg])print(numbers.map((x) => x.toString().split('').map((y) => '$y.jpg',),).toList(),[(1.jpg, 2.jpg, 3.jpg), (4.jpg, 5.jpg, 6.jpg), (7.jpg, 8.jpg, 9.jpg)]소괄호와 대괄호가 무슨차이죠.처음에 첫번째 처럼하면 list될것같았는데요. 같은줄 알았는데 다르더라구요. 2번째는 그냥 해본거예요.무슨차이인지 알고싶어요. final number = 123; print(number.toString().split('')); print(number.toString().split('').map((x)=> '$x.jpg'));[1, 2, 3](1.jpg, 2.jpg, 3.jpg)위에는 대괄호, 밑에는 소괄호 괄호가 같는결과는 아니네요.
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
goNamed질문
GoRoute( path: 'chef/register/two', name: ChefRegisteScreen2.routeName, builder: (_,state) => ChefRegisteScreen2( //rid: 123 ) ),goNamed로 String값 말고 Map이나 리스트 자료형을 넘기는 방법이 있을까요?
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
selectedDayPredicate 함수 관련 질문드립니다.
selectedDayPredicate에 파라미터로 들어가있는 함수는 DateTime타입의 인자를 필수적으로 받아와야 하는걸로 압니다. 그런데 코드에서 어떤 부분도 이 함수에 인자를 전달해주지 않는데 어떻게 date인자에 날짜들이 들어가있는지, 그렇다면 강의를 보지않았을 때 이 인자가 그런식으로 데이터가 들어있다는것을 어디서 어떻게 확인해야하는 지 궁금합니다.
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
onDaySelected가 타입이 아니라고 나오네요 그리고
안녕하세요.섹션21 TodayBanner 설계 강좌에서아래와 같은 에러 메시지가 나와서 더 이상 진행이 안 됩니다.final onDaySelected? onDaySelected;에서 onDaySelected가 타입이 아니라고 나오네요. 강좌에서 밖으로/위로(?) 빼는 작업과 statefull로 바꾸는 과정에서부터 에러가 나와서 여기서 막혀 더 이상 강의를 따라하며 들을 수 없습니다.혹시나 해서 소스 코드를 깃허브에 올려 두었습니다.소스코드는 아래에 있습니다.https://github.com/kooboom/calendar_schedulerlib/component/calendar.dart:12:9: Error: The name of a constructor must match the name of the enclosing class. const Calendar({ ^^^^^^^^lib/component/calendar.dart:9:9: Error: 'onDaySelected' isn't a type. final onDaySelected? onDaySelected; ^^^^^^^^^^^^^lib/component/calendar.dart:9:24: Context: This isn't a type. final onDaySelected? onDaySelected; ^^^^^^^^^^^^^lib/screen/home_screen.dart:28:13: Error: The method 'Calendar' isn't defined for the class '_HomeScreenState'. - '_HomeScreenState' is from 'package:calendar_scheduler/screen/home_screen.dart' ('lib/screen/home_screen.dart').Try correcting the name to the name of an existing method, or defining a method named 'Calendar'. Calendar( 소스코드는 아래에 있습니다.https://github.com/kooboom/calendar_scheduler
-
해결됨[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
Drift 패키지의 테이블 이름 질문
안녕하세요?캘린더 프로젝트 관련 질문사항이 있습니다.먼저 drift 패키지를 사용하기 위해 객체를 선언했습니다.- CategoryColors, Schedules모두 뒤에 s가 붙은 이름으로 테이블을 사용하기 위한 ORM 객체를 선언한것 까지는 알겠는데요. (s 붙이는게 필수?)drift가 자동 생성한 소스에 보면 s가 빠진 클래스들이 생성이 되어 있습니다.- CategoryColor, Schedule여기에 궁금함이 있습니다.처음에 객체 선언에 반드시 s를 붙여야 하는 건지?붙이지 않는다면 어떤 클래스 이름으로 자동 생성이 되는건지?Schedules 클래스 선언 -> (자동생성) Schedule 객체s 가 빠진 원리를 알고 싶습니다.
-
미해결Flutter 초입문 왕초보편
003 강의 중 다른 문제 질문드립니다.
flutter doctor 를 입력하라는 내용을 보고 따라 쳤는데 아래와 같은 문제가 발생하여 질문드립니다.flutter : 'flutter' 용어가 cmdlet, 함수, 스크립트 파일 또는 실행할 수 있는 프로그램 이름으로 인식되지 않습니다. 이름이 정확한지 확인하고 경로가 포함된 경우 경로가 올바른지 검증한 다음 다시 시도하십시오. 위치 줄:1 문자:1 + flutter doctor + ~~~~~~~ + CategoryInfo : ObjectNotFound: (flutter:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException
-
해결됨[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
section4 이미지 다운로드
프로젝트 강의에 링크를 추가해 주셨다고 했는데 링크가 어디에 있는지 못 찾겠네요.. 깃허브 주소 치고 들어가도github.com/serendipity1004/golden_rabbit_flutter_splash_screen 이 주소는 오류가 나요..ㅠㅠ
-
해결됨Flutter 앱 개발 기초
안녕하세요~ 해당 강의를 듣는 학생입니다!
강의를 듣는 학생입니다 !!혹시 현재 ios 애뮬레이터를 띄울 수 있는 방법은 없나요? ㅠㅠ
-
해결됨[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
섹션10 입니다. headline2에 중간라인이 길게 그어져 있는데요?
headline2 => displayMedium;이러게 하라고 했는데 headline2 적용해도 잘나오는데요.바꿔야 하나요.그리고,
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
Navigator 관련 질문드립니다.
코드를 작성하던 중 안드로이드 스튜디오에서Navigator.of(context).pop() 을Navigator.pop() 으로 자동완성 시켜주어 모르고 쓰던 도중 보니 Navigator.pop(true)라고 쓰면 add cast를 하라며 Navigator.pop(true as BuildContext)라고 고쳐주더군요. 찾아보니 Navigator.pop(true as BuildContext)와 Navigator.of(context).pop(true)는 완전히 같은 기능을 하는 것 같은데 공부가 필요한 내용일까요??
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
주문페이지 리프레쉬 인디케이터 문제
안녕하세요 선생님해당 강의내용에서 당겨서 새로고침하는 리프레쉬 인디케이터를 사용하면 상단에 로딩바가 하나 도는데다시 화면이 리프레쉬되면서 화면 중앙에 로딩바가 도는 것이 2중 로딩으로 보여지는 것 같아서pagination_list_view.dart 파일내RefreshIndicator( onRefresh: () async { ref.read(widget.provider.notifier).paginate(forceRefetch: true); },위 코드의 forceRefetch: true 를 삭제하는게 더 낫겠다는 판단에RefreshIndicator( onRefresh: () async { ref.read(widget.provider.notifier).paginate(); },해당코드를 사용 하려 하는데요근데 이렇게 포스리펫치를 삭제 하게 되면[홈] 메뉴와 [음식] 메뉴에서는 정상적으로 REQ RES 포스트 겟 요청이 가는데[주문] 메뉴에서는 아무런 응답이 없어서 새로고침이 되지 않습니다. 현재 강의에서 장바구니에서 주문완료를 눌러도 장바구니 내용이 비워지지 않는 문제와 로딩이 이중으로 되는 문제를 확인했는데 장바구니 부분은 주문완료버튼을 눌렀을때 주문내용을 비워버리면 해결 될 것 같다는 개념이라도 잡히는데포스리펫치 부분은 어디서 손을 대야 될지 아직 개념이 잡히지 않는데요 홈메뉴와 음식메뉴에서는 forceRefetch:true가 아니더라도 서버에서 자료를 받는 로직이 있는데주문메뉴에서는 앱에서 발생된 주문건에 대해서만 받아오는 로직이라 그게 아닌가? 싶은 생각만 듭니다.1.앱을 처음 로딩해서 주문메뉴에 들어갔을때 -> 로딩이 강제로 되니 새로운 주문건이 화면에 표시됨2.포스리팻치 true일경우 -> 강제 새로고침기능이 작동하니 새로운 주문건이 화면에 표시됨3.포스리팻치를 삭제하고 리프레쉬인디게이터만 사용할경우 -> 새로운 주문건이 표시가 안됨. 어떤 부분을 확인하거나 살펴보는게 좋을지 힌트를 주셨으면 좋겠습니다.만일 forceRefetch:true를 꼭 사용해야 되는 설계라면로딩바 대신에 스켈레톤을 사용한다면 2중 로딩느낌이 안날 것 같다는 생각이 듭니다.
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
섹션10 _TopPart 코드 정리 하다보니 정신이 없네요.
_TopPart코드 정리 하다보니 정신이 없네요.자르고 붙이고, 새로 코드넣고그냥 따라가도 되는지요. 몇번을 돌려봐야 할듯한데요..코드는 간단하게 보이는 듯한데요. 마 헷갈리네요
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
IntelliJ 자동완성으로 만든 Stateless에 관한 추가질문
지도어플만들기에서 _CustomGoogleMap을 코드정리하는 부분을 수강중인데요, _CustomGoogleMap을 인텔리제이에서 Refector>Extract Flutter Wedget 기능을 사용해서 만들었더니 다른부분은 강의내용과 똑같은데 생성자에서 const _CustomGoogleMap({ super.key, required this.initialPosition, }이 부분만 강의내용하고 다른데, IDE에서A value for optinal parameter 'key' isn't ever given이라는 경고메시지가 나오는데 이거 무시해도 되는건가요? 강의부분에서는const _CustomGoogleMap({ required this.initialPosition, Key? key, }) : super(key: key);이렇게 코딩하셨습니다.인텔리제이에서 생성자가 다르게 만들어지는게 플러터 문법이 업데이트로 바뀌어서 그런건지, 인텔리제이 생성자 자동완성을 수정해야할지 고민입니다! 답변 부탁드릴게요~!해당 코드 부분 캡쳐입니다.
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
StatefulWidget 기본생성자에 관한 질문
강의에서는 StatefulWiget를 자동완성으로 만들면 기본생성자가 const HomeScreen({Key? key}) : super(key: key);인데, IntelliJ에서 자동완성시키면 아래와같이 const Example({super.key}); 로 더 짧은 기본생성자가 나오네요.const HomeScreen({Key? key}) : super(key: key);const Example({super.key});이 두가지 생성자는 역할이 다른건가요?
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
섹션10 콤마와 세미콜론이 헷갈립니다.showCupertinoDialog 자동완성이 안떠요
콤마와 세미콜론이 헷갈립니다.IconButton( iconSize: 60.0, onPressed: () { // dialog showCupertinoDialog( context: context, builder: (BuildContext context) { return Container(); }, ); }, icon: Icon( Icons.favorite, color: Colors.red, ), ),showCupertinoDialog부분에 콤마와 세미콜론이 헷갈립니다.그리고 showCupertinoDialog 적으면 자동완성이 떠야 하는데 저는 안뜨네요.
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
drift 패키지의 select ~ join 부분에서 질문이 있습니다.
아래 소스에서 질문 있는데요.final query = select(schedules).join([ innerJoin(categoryColors, categoryColors.id.equalsExp(schedules.colorId)) ]); query.where(schedules.date.equals(date)); return query.watch().map( (rows) => rows .map((row) => ScheduleWithColor( schedule: row.readTable(schedules), categoryColor: row.readTable(categoryColors), )) .toList(), );보통 테이블 조인을 하게 되면SELECT a.*, b.*FROM schedule a, categorycolor bWHERE a.id = b.id;이렇게 되어야 정상일텐데,왜 drift 문법의 select 에서는 select(schedules)로 표현이 되었을까요?
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
테마 적용해보기 - main.dart 파일에 theme을 적용하는데 뭔가 이상해요.
수업화면과 약간 달라서요. 중간 취소줄이 그어 있어요. 뭐가 문제일까요?
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
코드정리
AppBar 위젯 코드를 정리하실 때, stless위젯을 따로 만들지 않고 함수로 가져오셨는데 위젯을 함수로 가져올지 Expnade 위젯처럼 stless위젯으로 가져오는지 어떤 기준으로 나뉘는건가요?class AppBar extends StatelessWidget { const AppBar({super.key}); @override Widget build(BuildContext context) { return AppBar( title: Text( "App name", style: TextStyle( color: Colors.blueAccent, ), ), backgroundColor: Colors.white, ); } }또한 AppBar를 Stless 위젯으로 만들어보려고 했을때 title 부분과 backgroundColor 부분에서 오류가 나는데 그 이유도 알 수 있을까요?
-
미해결Flutter 초입문 왕초보편
52강 키/몸무게 값에 대한 조건을 더 추가해주고 싶으면 어떻게 해야 할까요?
만약에 키나 몸무게 필드에 숫자가 아닌 값을 입력할 경우 '숫자를 입력하세요'라고 출력하고 싶은데 어떻게 하면 좋을까요? 그리고 입력된 숫자가 특정 범위를 넘길 경우 제한 하는 방법도 궁금합니다. 뭔가 아래와 같은 느낌으로 하고싶은데 방법이 궁금합니다.TextFormField( decoration: const InputDecoration( border: OutlineInputBorder(), hintText: '키', ), keyboardType: TextInputType.number, validator: (value){ if(value == null || value.isEmpty){ return '키를 입력하세요'; }else if(value의 타입 != TextInputType.number){ return '숫자를 입력하세요.'; }else if(value > 1000){ return '정상적인 값이 아닙니다.'; } return null; }, ),