묻고 답해요
150만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
순위 정보를
불러오고 있어요
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
데이터가 구조가 List<dynamic> 형식일때 질문 드려 봅니다.
[ { "no": 1, "write_date": "2015-03-25 13:28:15", "content": "쇼핑몰 공지사항\r\n 활용한 게시판입니다." }, { "no": 2, "write_date": "2015-03-25 13:28:40", "content": "쇼핑몰 오픈이벤트!\r\n쇼핑몰 오픈이벤트로 최대 30% 까지 할인된 가격으로 만나보세요." },]안녕하세요.데이터가 강의처럼 meta와 data로 나뉘고 그안에 List로 들어오는게 아니고 위에처럼 그냥 List로 들어온다면 1.Future<CursorPagination<RestaurantModel>> paginate();이렇게 사용 못하는건가요?된다면class CursorPagination<T> extends CursorPaginationBase { 여기를 어떻게 해야 할지 모르겠습니다.} 2.Future<List<RestaurantModel>> paginate(); 이렇게 사용해야 한다면abstract class CursorPaginationBase {} 이거는 어떻게 사용해야 할까요? 3.Error: type 'List<dynamic>' is not a subtype of type 'Map<String, dynamic>?' in type cast 이렇게 에러가 뜨는데CursorPagination<T> 이런 구조로 한다는거 자체가 말이 안되는건가요?Future<List<RestaurantModel>> 이런 형식으로 해야 한다면 RestaurantModel을 T로 받으면서 할 수 없는건가요?CursorPaginationBase 이거는 RestaurantModel을 class RestaurantModel extends CursorPaginationBase이런식으로 사용해야 할까요?
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
여러개의 Repository 에서 하나의 Dio를 공유해야 하는 이유가 뭔가요?
여러개의 Repository 에서 하나의 Dio를 공유해야 하는 이유가 뭔가요? 장점에 대해서 나중에 설명해 주신다고 하셨는데 그 내용을 못찾았어요.
-
해결됨Only Javascript만으로 배우는 하이브리드앱 패키징
onesignal 연동 확인 부탁드립니다!
window.plugins.OneSignal.setAppId("원시그널앱ID"); //푸시메세지 수신부 window.plugins.OneSignal.setNotificationOpenedHandler(function(jsonData){ console.log('notificationOpenedCallback: ' + JSON.stringify(jsonData)); }); //푸시권한 허용팝업(android OS 13 이상에서 사용됨) window.plugins.OneSignal.promptForPushNotificationsWithUserResponse(function(accepted) { console.log("User accepted notifications: " + accepted); });위 코드가 정상적으로 작동을 안하는 것 같습니다! 버전 문제인지 모르겠는데 코드 추가하고 onesignal 사이트에서 "Check Subscribed Users" 버튼을 클릭하면 아래 같은 오류가 발생하는데 확인 부탁드립니다 We haven't detected any subscribed users yet for this platform. Try some of the tips below or contact us for support.Run OneSignal.SetLogLevel(OneSignal.LOG_LEVEL.DEBUG, OneSignal.LOG_LEVEL.DEBUG);before OneSignal initialization and check your ADB logcat for errors or warnings.Verify that the OneSignal App ID is correct in your app or site.
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
아이폰 배포 관련
안녕하세요 강사님~플러터로 웹뷰 이용하여 앱을 만들었는데안드로이드는 APK파일 만드는것이 간단하였으나아이폰의 IPA를 생성하려고 하니 좀 힘이듭니다.앱스토어 개발자 비용을 내지 않고는 IPA파일 생성이 전혀 불가능한지궁금합니다.xcode와 핸드폰 연결해서는 사용중인데, 내부 사용자들한테 배포를 좀 해보려고 하는데전혀 안되네요.. ㅠㅠ
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
retrofit 요청 후 상태 코드
retrofit에서 요청 후에 인터셉터 이후에 UI 단에서 스낵바를 띄우기 위해 상태코드를 반환 받고 싶은데 Response타입을 반환 시키려면 파일을 임의로 수정해주어야 하더라고요 혹시 다른 방법이 있을까요? @POST('/reservation') @Headers({'Authorization': 'true'}) Future<Response<dynamic>> makeReservation({ @Body() required ReservationRequestModel reservation, }); child: IconButton( onPressed: () { reservationRepositoryProvide .getRepository() .makeReservation( reservation: ReservationRequestModel( meetingRoomId: widget.room.id, reservationStartTime: selectReservationTimeData .selectedFullDate.value! .add(1.seconds), reservationEndTime: selectReservationTimeData .selectedFullDate.value! .add(const Duration(hours: 1)), members: 4, )) .then((res) { if (res.statusCode == 201) { context.showSnackbar( message: '예약 완료 되었습니다. 마이페이지에서 확인해주세요', isSuccess: true); } else { final errorMessage = res.data['errorMessage']; context.showSnackbar( message: errorMessage, isSuccess: false); } }); }, 현재 상태 코드를 반환 시켜 스낵바를 띄워주는데 아래처럼 retrofit 코드를 임의로 고쳐야하네요 @override Future<Response<dynamic>> makeReservation( {required ReservationRequestModel reservation}) async { const _extra = <String, dynamic>{}; final queryParameters = <String, dynamic>{}; final _headers = <String, dynamic>{r'Authorization': 'true'}; _headers.removeWhere((k, v) => v == null); final _data = <String, dynamic>{}; _data.addAll(reservation.toJson()); final _result = await _dio .fetch<Map<String, dynamic>>(_setStreamType<Response<dynamic>>(Options( method: 'POST', headers: _headers, extra: _extra, ) .compose( _dio.options, '/reservation', queryParameters: queryParameters, data: _data, ) .copyWith( baseUrl: _combineBaseUrls( _dio.options.baseUrl, baseUrl, )))); // final value = Response<dynamic>.fromJson(_result.data!); return _result; }다른 방법이 있을까요?
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
Refresh 토큰 만료 시 재로그인 처리 문의
안녕하세요좋은강의 잘 듣고 있습니다앱을 처음 제작해 보고 있는데 일반적으로 앱은 설치 후 한번만 로그인하면 삭제하지 않는 동안에는 앱 실행 시 로그인은 다시 하지 않는 것으로 알고 있습니다강의 내용을 보면 리프레시 토큰까지 만료되면 다시 로그인 하는 화면으로 가게 되어 있는데 일반적인 다른 앱은 리프레시 토큰 유효기간을 정말 길게 설정하는 건가요? 아니면 사용자가 최초 로그인 시 로그인 성공하면 아이디랑 패스워드를 저장했다가 리프레시 토큰까지 만료되면 저장한 아이디랑 패스워드를 불러와서 다시 로그인 하는 과정이 있지만 사용자 눈에는 보이지 않는 것인가요? 아이디랑 패스워드를 저장해 놓지 않으면 리프레시 토큰까지 자동으로 다시 받아오는 것은 불가능할 거 다른 앱들은 어떻게 한번만 로그인 하면 계속 자동로그인이 되는지 궁금합니다
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
유저 변경 시 장바구니 리셋하기
장바구니가 현재 프로바이더를 통해서 불러오는 방식을 사용중인데, 이렇게 하는 경우 처음 유저가 로그아웃 하고, 다음 유저가 들어왔을 시에 프로바이더 값이 그대로 유지되어서 이전 유저의 장바구니를 열람할 수 있는 문제가 생기는데, 이런 경우를 대비해서 로그인 시에 모든 프로바이더 값들을 초기화시키고 싶은데, providerscope 안에 있는 모든 프로바이더들을 쉽게 초기화시킬 수 있는 방법이 있을까요? 감사합니다
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
restaurant_repository.g.dart header 생성 문제
import 'package:code_factory/restaurant/model/restaurant_detail_model.dart';import 'package:dio/dio.dart' hide Headers;// import 'package:retrofit/http.dart';import 'package:retrofit/retrofit.dart';part 'restaurant_repository.g.dart';@RestApi()abstract class RestaurantRepository { factory RestaurantRepository(Dio dio, {String baseUrl}) = _RestaurantRepository; @GET('/{id}') @Headers({'accessToken' : 'true'}) Future<RestaurantDetailModel> getRestaurantDetail({ @Path() required String id, });} // GENERATED CODE - DO NOT MODIFY BY HANDpart of 'restaurant_repository.dart';// **************************************************************************// RetrofitGenerator// **************************************************************************// ignore_for_file: unnecessary_brace_in_string_interps,no_leading_underscores_for_local_identifiersclass _RestaurantRepository implements RestaurantRepository { _RestaurantRepository( this._dio, { this.baseUrl, }); final Dio _dio; String? baseUrl; @override Future<RestaurantDetailModel> getRestaurantDetail( {required String id}) async { const _extra = <String, dynamic>{}; final queryParameters = <String, dynamic>{}; final _headers = <String, dynamic>{r'accessToken': 'true'}; _headers.removeWhere((k, v) => v == null); final Map<String, dynamic>? _data = null; final _result = await _dio.fetch<Map<String, dynamic>>( _setStreamType<RestaurantDetailModel>(Options( method: 'GET', headers: _headers, extra: _extra, ) .compose( _dio.options, '/${id}', queryParameters: queryParameters, data: _data, ) .copyWith( baseUrl: _combineBaseUrls( _dio.options.baseUrl, baseUrl, )))); final value = RestaurantDetailModel.fromJson(_result.data!); return value; } RequestOptions _setStreamType<T>(RequestOptions requestOptions) { if (T != dynamic && !(requestOptions.responseType == ResponseType.bytes || requestOptions.responseType == ResponseType.stream)) { if (T == String) { requestOptions.responseType = ResponseType.plain; } else { requestOptions.responseType = ResponseType.json; } } return requestOptions; } String _combineBaseUrls( String dioBaseUrl, String? baseUrl, ) { if (baseUrl == null || baseUrl.trim().isEmpty) { return dioBaseUrl; } final url = Uri.parse(baseUrl); if (url.isAbsolute) { return url.toString(); } return Uri.parse(dioBaseUrl).resolveUri(url).toString(); }}생성된 repository.g.dart 파일을 보시면final _headers = <String, dynamic>{r'accessToken': 'true'}; accessToken 앞에 계속 r 이 붙습니다.왜이럴까요..
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
border 속성
다른분들께 비슷한 답변 주신것들 모두 읽었는데요.. 아무리 해도 이해가 안가서요... 강의에서요 border속성은 기본 속성이라고 하셨으니 focusedBorder, enabledBorder, disabledBorder, errorBorder, focusedErrorBorder 의 기본 속성이라고 생각합니다. 그럼 예제에 focusedBorder, 를 입력하기 전에는 border 속성을 가져야 하는 거 아닌가요?또한 enabledBorder도 입력하기 전에는 border 속성을 가져야 하는 거 아닌가요? 마치 border은 작동을 안하는 거 처럼 보여집니다. 그래서 기본 속성이라는 말이 이해가 안갑니다. 적용이 안되는 기본 속성이라는건 없으니까요 . 이해가 안가서 질문을 남깁니다...! ㅠㅠ 선생님...!
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
섹션15 고라우터적용하기에서 redirect 부분 관련 질문
안녕하세요! 현재 설치한 go_router는 13.2.4 버전입니다.routerProvider에서 만들어주는 GoRotuer의 redirect에 authProvider에 있는 redirectLogic(GoRouterState state)함수는 파람은로 GoRouterState 를 받기로 되어 있지 않나요?그래서 저는 아래처럼 routerProvider에서 만들어주는 GoRotuer의 redirect에 redirectLogic(state)를 넘겨줘야 에러가 없던데 강의에서는 어떻게 그냥 되셨을까요...?아래는 강의 스크린샷입니다.궁금해서 여쭤봅니당
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
Retrofit Customization
안녕하세요 강사님, 잘 수강 중에 질문이 있습니다. retrofit이 만들어내는 restaurant_repository.g.dart 에서 getRestaurantDetail 함수 리턴쪽에 보시면, final value = RestaurantDetailModel.fromJson(_result.data!);와 같이 되어 있는 것을 확인할 수 있습니다.근데 백단에서 보통 data만 던지지 않고 응답코드, 메시지 등 정형화된 포맷으로 줄 수 있다고 생각이 듭니다. 예를 들어, 아래와 같이,{ "code": 200, "message": "~", "result": { ~ } }온다면,혹시 _result.data!.['result'] 와 같이 생성이 될 수 있도록 커스터마이징 할 수 있을까요?
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
provider 관련 질문 드립니다.
provider 사용에 관해 질문 드립니다. provider 를 같은 클래스로 여러 인스턴스를 만들어 사용할때위젯에서 어떻게 자신이 구독중이 provider 를 찾아서 값을 바꿀수 있는가에 대해 질문 드립니다.현재 아래와 같은 code 구성을 가지고 있습니다.import 'package:flutter/material.dart';import 'package:provider/provider.dart';void main() { runApp( MultiProvider( providers: [ Provider<GateWayProviderALL>( create: (_) => GateWayProviderALL('sensor1', 1000), ), Provider<GateWayProviderALL>( create: (_) => GateWayProviderALL('sensor2', 1000), ), ], child: MyApp(), ), );}class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', home: MyHomePage(), ); }}class MyHomePage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Multi Sensor Display'), ), body: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Expanded( child: ImageCanvasConsumeGateWay('sensor1'), ), Expanded( child: ImageCanvasConsumeGateWay('sensor2'), ), ], ), ); }}class ImageCanvasConsumeGateWay extends StatelessWidget { final String sensorName; ImageCanvasConsumeGateWay(this.sensorName); @override Widget build(BuildContext context) { // Provider의 인스턴스를 참조하도록 수정합니다. final provider = Provider.of<GateWayProviderALL>(context); return Consumer<GateWayProviderALL>( builder: (context, imageProvider, child) { CameraImageDTO? imageDto = provider.PopCameraImageDTO(sensorName); if (imageDto != null) { return CustomPaint( painter: ImagePainter(imageDto.rowImage!), size: Size(320 / 2, 180 / 2), ); } else { return Center(child: CircularProgressIndicator()); } }, ); }}class ImagePainter extends CustomPainter { final ui.Image image; ImagePainter(this.image); @override void paint(Canvas canvas, Size size) { // 그리는 로직 구현 } @override bool shouldRepaint(covariant CustomPainter oldDelegate) => false;} GateWayProviderALL 을 두번 생성해서 ImageCanvasConsumeGateWay 위젯에서 자신에게 맞는 provider 를 읽어와 값을 변경해주고 싶은데 찾아보니 provider 는 데이터 형으로 provider 을 찾아 오니클래스를 여러개 파라고 하는데 하나의 클래스에서 인스턴스를 여럿 만들어 처리할순 없나여?
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
StateNotifierProvider로 생성하고 수정한 데이터를 함수 내부에서 불러오기
안녕하세요. 코드팩토리님. 강의를 참고하여 한가지 기능을 만들어보고자 했습니다. 현재까지 데이터모델을 생성하고, 데이터모델 타입으로 된 리스트들을 저장하는 프로바이더를 생성하여 read로 리스트를 추가 및 삭제하며, watch를 통해 목록을 보도록 하였습니다.그런데 제가 추가하고자 하는 기능 중, consumerWidget과 같은 위젯을 사용하지 않고 때에 따라 함수를 부를 때에 함수 내부에서 프로바이더에 저장된 데이터목록을 불러와야 하는 상황이 되었고, 코드를 작성해보았는데 역시나 위젯이 아닌 함수에서 호출을 하려니 watch, read등 작동하지 않는 문제가 발생하였습니다. void scheduleAlarmFishs() async { //ref로 데이터 가져오기. final container = ProviderContainer(); final fishs = container.read(fishListProvider); // read 사용 print('Retrieved ${fishs.length}'); }혹시 이런식으로 함수를 통한 접근은 아예 불가능한 건가요?ㅠㅠ
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
screen 하나 당 하나의 notifier provider를 사용하는 것이 좋나요?
회사 프로젝트에서 screen 하나에 여러 개의 notifier provider가 상위, 하위 위젯마다 따로 따로 포함되어 있습니다. 이런 구조가 괜찮은 건지 잘 모르겠어서 질문 드립니다....
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
Provider과 stateful 같이 쓰는 이유??
provide를 사용해도 watch해서 사요하면 화면이 바뀌는데Provider+stateful을 왜 사용하는지 모르겠습니다 ㅠㅠ(extends결합한 consumer…)
-
해결됨[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
nested구조에서 JsonSerializable를 사용하고 싶을 땐 어떤 방법을 고려해야하나요?
만약 deliveryFee에 대한 서버의 응답이 json['delivery']['fee'] 일 경우 deliveryFee 란 변수를 그대로 사용한다는 가정하에JsonSerializable에선 어떤 방법으로 처리해줘야하는걸까요?
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
아래 질문 하신분이랑 정확히 같은 증상입니다
정확히 ‘127.0.0.1:3000’ const로 선언 해놨는데로그인 요청시마다 포트가 랜덤하게 바뀌며 61번 에러가 납니다디오 버전 똑같이 설정했습니다.
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
print(resp.data); 여기부터 안되네요
응답이 없네요메세지가 안나와요D/EGL_emulation( 5140): app_time_stats: avg=6131.28ms min=9.11ms max=12253.46ms count=2이건만 나오는데 안드로이드 사용해서 ip 문제인가 해서 final ip = Platform.isAndroid ? simulatorIp : emulatorIp; 이걸로 바꾸어 봐도 안되구요단, 메세지는 조금 달라졌습니다.D/EGL_emulation( 7555): app_time_stats: avg=13725.68ms min=13725.68ms max=13725.68ms count=1D/EGL_emulation( 7555): app_time_stats: avg=688.99ms min=273.39ms max=1104.59ms count=2E/flutter ( 7555): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: DioError [DioErrorType.other]: SocketException: Connection refused (OS Error: Connection refused, errno = 111), address = 127.0.0.1, port = 52818E/flutter ( 7555): Source stack:이하 생략... 해결 부탁드립니다.
-
해결됨[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
안녕하세요. 백그라운드 관련 질문이 있습니다.
이 강의를 보고 영감을 받아 작은 프로젝트를 진행중에 있는데 궁금한점이 있어서 올립니다.알람 기능을 개발하면서 android_manager_alarm_plus 패키지를 사용중인데 최근 안드로이드 버전은 Doze모드로 인해 백그라운드에서는 알람매니저가 제대로 활성화되지 않는다고 들었습니다.저 역시 만든 코드를 테스트하면 백그라운드 상황에서 알람 상태처리까지는 이루어지더라도 포그라운드 화면으로 넘어가는(쉽게 말해 홈화면이나 꺼진 화면에서 알람 화면이 떠야하는) 과정이 이루어지지 않아 다른 방법을 모색하고 있는 중입니다. 코팩님도 백그라운드에서 처리하는 앱개발이나 유지보수를 해보신 경험이 있으셨다면 안드로이드 버전이 올라갈수록 어떻게 진행하셨는지 궁금해서 여쭤봅니다.최근 구글링을 하다보니 FCM을 권장한다는 말이 있던데 이건 아무래도 서버통신이다보니 네트워크연결이 반드시 필요해보이는 것 같아 고려중에 있습니다
-
미해결급하게 준비하는 모바일 앱 점검
디컴파일을 통해 루팅 우회하기에서 질문있습니다.
안녕하세요.디컴파일을 통해 루팅 우회하기 수업에서 질문이 있습니다. 영상에 나와있는 그대로 c.smali 파일에서 super를 su로 변경, MainActivity.smali에서 라인87의 if-eqz를 if-nez로 변경 후 서명하여 nox에서 설치를 했습니다. 하니, 아래와 같이 텍스트만 변경이 되고 앱이 꺼지는 현상이 여전히 있었습니다.(MainActivity.smali 라인 71의 if-eqz를 if-nez로 변경도 해보았으나 동일 현상)혹시 몰라서 c.smali에서 수정하고 MainActivity.smali에서는 수정을 안하고 혹은 그 반대로도 해보는 등 여러가지로 진행을 해보았는데요.동일한 현상이 확인되어 영상과 같이 되지 않아 질문드립니다.감사합니다.
주간 인기글
순위 정보를
불러오고 있어요