inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

172만명의 커뮤니티!! 함께 토론해봐요.

주문하기 클릭 시 Order 생성 안 되고 500에러가 뜹니다.

해결됨

[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!

질문 내용 주문 시 계속해서 주문에 실패했다고 떠서, 무엇이 문제이지 하고 봤는데, Status 500 에러가 던져집니다. 그래서 서버 쪽 로그를 봤는데, 서버에서 이런 Exception이 던져지고 있습니다. [Nest] 63134 - 2023. 08. 13. 오전 2:35:36 ERROR [ExceptionsHandler] Cannot read properties of undefined (reading 'restaurant') TypeError: Cannot read properties of undefined (reading 'restaurant') at OrderService.postOrder (/Users/nx006/Documents/vscode/flutter-lv2-server/src/order/order.service.ts:36:8) at OrderController.postOrder (/Users/nx006/Documents/vscode/flutter-lv2-server/src/order/order.controller.ts:63:30) at /Users/nx006/Documents/vscode/flutter-lv2-server/node_modules/@nestjs/core/router/router-execution-context.js:38:29 at processTicksAndRejections (node:internal/process/task_queues:95:5) 'restaurant' 속성을 읽지 못한다는 게 무슨 말일까요? 애초에 Request Body에 Restaurant 속성 자체가 없는데, 400 에러도 아니고 왜 이런 에러가 서버 쪽에서 나는 지 모르겠습니다. 코드 전문 일단은, 현재 PostBody와 Response Body에 대한 모델입니다: // ignore_for_file: invalid_annotation_target /// order_model.dart import 'package:delivery_app/common/model/model_with_id.dart'; import 'package:delivery_app/common/utils/data_utils.dart'; import 'package:delivery_app/restaurant/model/restaurant_model.dart'; import 'package:flutter/foundation.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; part 'order_model.freezed.dart'; part 'order_model.g.dart'; @freezed class OrderProductModel with _$OrderProductModel { factory OrderProductModel({ required String id, required String name, required String detail, @JsonKey(fromJson: DataUtils.pathToUrl) required String imgUrl, required int price, }) = _OrderProductModel; factory OrderProductModel.fromJson(Map<String, dynamic> json) => _$OrderProductModelFromJson(json); } @freezed class OrderProductAndCountModel with _$OrderProductAndCountModel { factory OrderProductAndCountModel({ required OrderProductModel product, required int count, }) = _OrderProductAndCount; factory OrderProductAndCountModel.fromJson(Map<String, dynamic> json) => _$OrderProductAndCountModelFromJson(json); } @freezed class OrderModel with _$OrderModel implements IModelWithId { factory OrderModel({ required String id, required RestaurantModel restaurant, required List<OrderProductAndCountModel> products, required int totalPrice, @JsonKey(fromJson: DataUtils.stringToDateTime) required DateTime createdAt, }) = _OrderModel; factory OrderModel.fromJson(Map<String, dynamic> json) => _$OrderModelFromJson(json); } /// post_order_body.dart import 'package:freezed_annotation/freezed_annotation.dart'; part 'post_order_body.freezed.dart'; part 'post_order_body.g.dart'; @freezed class PostOrderBody with _$PostOrderBody { const factory PostOrderBody({ required String id, required List<PostOrderBodyProduct> products, required int totalPrice, required String createdAt, }) = _PostOrderBody; factory PostOrderBody.fromJson(Map<String, dynamic> json) => _$PostOrderBodyFromJson(json); } @freezed class PostOrderBodyProduct with _$PostOrderBodyProduct { const factory PostOrderBodyProduct({ required String id, required int count, }) = _PostOrderBodyProduct; factory PostOrderBodyProduct.fromJson(Map<String, dynamic> json) => _$PostOrderBodyProductFromJson(json); } 그리고 다음은 Repository 코드입니다. /// order_provider.dart import 'package:delivery_app/common/const/data.dart'; import 'package:delivery_app/common/dio/dio.dart'; import 'package:delivery_app/order/model/order_model.dart'; import 'package:delivery_app/order/model/post_order_body.dart'; import 'package:dio/dio.dart' hide Headers; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:retrofit/retrofit.dart'; part 'order_repository.g.dart'; final orderRepositoryProvider = Provider((ref) { final dio = ref.watch(dioProvider); return OrderRepository(dio, baseUrl: 'http://$ip/order'); }); // baseUrl : http://$ip/order @RestApi() abstract class OrderRepository { factory OrderRepository(Dio dio, {String baseUrl}) = _OrderRepository; @POST('/') @Headers({'accessToken': 'true'}) Future<OrderModel> postOrder({ @Body() required PostOrderBody body, }); } 다음은 Provider 입니다. /// order_provider.dart // ignore_for_file: public_member_api_docs, sort_constructors_first import 'package:delivery_app/order/model/post_order_body.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:uuid/uuid.dart'; import 'package:delivery_app/order/model/order_model.dart'; import 'package:delivery_app/order/repository/order_repository.dart'; import 'package:delivery_app/user/provider/basket_provider.dart'; final orderProvider = StateNotifierProvider<OrderStateNotifier, List<OrderModel>>( (ref) => OrderStateNotifier( ref: ref, repository: ref.watch(orderRepositoryProvider), )); class OrderStateNotifier extends StateNotifier<List<OrderModel>> { final Ref ref; final OrderRepository repository; OrderStateNotifier({ required this.ref, required this.repository, }) : super([]); Future<bool> postOrder() async { const uuid = Uuid(); final id = uuid.v4(); final state = ref.read(basketProvider); try { await repository.postOrder( body: PostOrderBody( id: id, products: state .map((e) => PostOrderBodyProduct( id: e.product.id, count: e.count, )) .toList(), totalPrice: state.fold<int>( 0, (previousValue, element) => previousValue + element.product.price * element.count, ), createdAt: DateTime.now().toString(), ), ); return true; } catch (e) { print('error: $e'); return false; } } } 그리고 View 단, 특 주문하기 버튼입니다: ElevatedButton( style: ElevatedButton.styleFrom( backgroundColor: primaryColor, ), onPressed: basket.isEmpty ? null : () async { final response = await ref .read(orderProvider.notifier) .postOrder(); if (context.mounted) { if (response) { context.goNamed(OrderDonePage.routeName); } else { ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('주문에 실패했습니다.'), ), ); } } }, child: const Text('결제하기'), ), 서버 쪽 코드 혹시 몰라서, 에러가 발생하는 서버 쪽 코드 역시 첨부합니다. 일단 제가 건든 코드는 없습니다. import { Injectable } from '@nestjs/common'; import { CreateOrderDto } from './dto/create-order.dto'; import { CacheService } from '../cache/cache.service'; import { User } from '../user/entities/user.entity'; import { Order } from './entities/order.entity'; import { CoreService } from '../core/core.service'; import { PaginationDto } from '../core/dto/pagination.dto'; import { Pagination } from '../core/entity/pagination.entity'; import { OrderProduct } from './entities/order-product-entity'; @Injectable() export class OrderService { constructor( private cacheService: CacheService, private coreService: CoreService, ) {} paginateOrders(user: User, paginationDto: PaginationDto): Pagination<Order> { const result = this.coreService.paginate( this.cacheService.orders, paginationDto, ); return { ...result, data: result.data.map((item) => new Order(item)), }; } postOrder(user: User, createOrderDto: CreateOrderDto): Order { const newOrder = new Order({ id: createOrderDto.id, user, restaurant: this.cacheService.products.find( (x) => createOrderDto.products[0].productId === x.id, ).restaurant, products: createOrderDto.products.map((basketItem) => ({ product: new OrderProduct( this.cacheService.products.find( (product) => basketItem.productId === product.id, ), ), count: basketItem.count, })), totalPrice: createOrderDto.totalPrice, createdAt: createOrderDto.createdAt, }); this.cacheService.orders = [newOrder, ...this.cacheService.orders]; return newOrder; } } @ApiTags('order') @ApiExtraModels(PaginationDto, Order) @Controller('order') export class OrderController { constructor(private readonly orderService: OrderService) {} @UseGuards(AccessTokenGuard) @ApiOperation({ summary: '주문 Pagination', }) @ApiPaginatedOkResponseDecorator(Order, { description: 'Pagination 결과', }) @Get() paginateOrder( @Request() req, @Query() paginationDto: PaginationDto, ): Pagination<Order> { return this.orderService.paginateOrders(req.user, paginationDto); } @UseGuards(AccessTokenGuard) @Post() @ApiOperation({ summary: '주문 생성하기', }) @ApiBody({ type: CreateOrderDto, }) @ApiOkResponse({ status: 201, type: Order, }) postOrder(@Request() req, @Body() body: CreateOrderDto): Order { return this.orderService.postOrder(req.user, body); } }

  • flutter
  • 하이브리드-앱
limazero14 댓글 1 좋아요 0 조회수 414

android setup 안해도 되나요

미해결

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

저는 mac을 사용하는데 adroid로는 배포할 일이 없어서요 혹시 android setup은 지나쳐도 될까요??!

  • flutter
  • 클론코딩
tngusdl527 댓글 1 좋아요 0 조회수 326

버퍼링

미해결

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

버퍼링이 너무 심해서 강의를 시청할수가없을정도에요

  • flutter
  • 클론코딩
YOUNGJAE KIM 댓글 1 좋아요 0 조회수 337

색상정보 DB에 넣기 질문

미해결

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

제대로 한것 같은데 에러가 뜨네요 ㅠㅠ 에러 점검 부탁드립니다~~ lib/database/drift_database.dart:34:7: Error: The non-abstract class 'LocalDatabase' is missing implementations for these members: - GeneratedDatabase.schemaVersion - QueryExecutorUser.schemaVersion Try to either - provide an implementation, - inherit an implementation from a superclass or mixin, - mark the class as abstract, or - provide a 'noSuchMethod' implementation. class LocalDatabase extends _$LocalDatabase{ ^^^^^^^^^^^^^ ../../AppData/Local/Pub/Cache/hosted/pub.dev/drift-2.10.0/lib/src/runtime/api/db_base.dart:27:11: Context: 'GeneratedDatabase.schemaVersion' is defined here. int get schemaVersion; ^^^^^^^^^^^^^ ../../AppData/Local/Pub/Cache/hosted/pub.dev/drift-2.10.0/lib/src/runtime/executor/executor.dart:66:11: Context: 'QueryExecutorUser.schemaVersion' is defined here. int get schemaVersion; ^^^^^^^^^^^^^ Target kernel_snapshot failed: Exception FAILURE: Build failed with an exception. * Where: Script 'C:\flutter\packages\flutter_tools\gradle\flutter.gradle' line: 1201 * What went wrong: Execution failed for task ':app:compileFlutterBuildDebug'. > Process 'command 'C:\flutter\bin\flutter.bat'' finished with non-zero exit value 1 * Try: > Run with --stacktrace option to get the stack trace. > Run with --info or --debug option to get more log output. > Run with --scan to get full insights. * Get more help at https://help.gradle.org BUILD FAILED in 7s Exception: Gradle task assembleDebug failed with exit code 1

  • flutter
  • 클론코딩
MJ90 댓글 1 좋아요 0 조회수 479

우분투에서 안스 쓰고 싶어요

미해결

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

혹시 리눅스 환경에서의 안드로이드 스튜디오 세팅 영상을 만들어 주실 수 있으신가요?

  • flutter
  • 클론코딩
robobo153 댓글 1 좋아요 0 조회수 288

안드로이드 BouncingScrollPhysics적용 질문

미해결

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

안드로이드 폰에서 BouncingSrollPhysics를 적용해서 iOS같은 효과를 내고 싶습니다. 그런데 bouncing을 적용해도 자식 위젯들이 화면을 넘어가지 않으면 바운싱 되지않으며 스크롤도 되지 않습니다. 자식 위젯이 1개일 때, 안드로이드에서도 iOS같은 효과를 어떻게 낼 수 있나요??

  • flutter
  • 클론코딩
zla_db 댓글 1 좋아요 0 조회수 416

페이지 fetchMore 중복요청 문제

미해결

[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!

섹션 9 상태관리 프로젝트에 적용하기 > 완성된 Pagination 로직 실행해보기 8분경에 요청이 중복으로 들어가는 부분을 고친다고 말씀하셨는데 저부분을 고치는 강의가 뒤에 있나요? 다른 프로젝트에 적용할때 같은 문제가 발생해서 언급을 하셨다면 어느부분인지 찾지를 못하겠네요.

  • flutter
  • 하이브리드-앱
freeduc 댓글 1 좋아요 0 조회수 308

UserMeProvider 회원가입

해결됨

[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!

안녕하세요 강사님 또 저입니다ㅠㅠ 중급강의의 로그인과 인증로직을 조금씩 변형해 현재 진행중인 프로젝트에 적용하려하는데 회원가입 POST가 필요한데 이를 예를들면 강의기준으로 UserMeStateNotifier내부에 Future<UserModelBase> login가 있듯이, Future<UserModel> postUser(UserModel userModel)로 Provider파트에 선언하고 @POST() Future<UserModel> postUser(@Body() UserModel user); 이런형태로 한 UserModel내에 선언해도될지 감이 안잡혀서 여쭤봅니다.이런부분에서 막힌거보니 아직 완전 이해를 못한거같습니다ㅠㅠ

  • flutter
  • 하이브리드-앱
word high 댓글 3 좋아요 0 조회수 418

U&I onPressed 질문

미해결

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

void onPressed() 함수를 만들어주었는데 왜 TopParts 내에서 파라미터는 onHeartPressed() 함수를 부르는게 아닌 onHeartPressed 로 선언을 해주어야 하나요?

  • flutter
  • 클론코딩
returnzmagic 댓글 1 좋아요 0 조회수 219

video_player 강의 관련 질문드립니다

미해결

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

import 'dart:ui'; import 'package:flutter/material.dart'; import 'package:image_picker/image_picker.dart'; import 'package:videoplayer/component/video_player.dart'; class HomeScreen extends StatefulWidget { const HomeScreen({super.key}); @override State<HomeScreen> createState() => _HomeScreenState(); } class _HomeScreenState extends State<HomeScreen> { XFile? video; @override Widget build(BuildContext context) { return Scaffold( body: video == null? renderEmpty() : renderVideo() ); } Widget renderVideo(){ return Center( child: CustomVideoPlayer(video: video!), ); } Widget renderEmpty(){ return Container( width: MediaQuery.of(context).size.width, decoration: getBoxDecoration(), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Logo( onLogoTap: onLogoTap, ), SizedBox( height: 10.0, width: 10.0, ), Name(), ], ), ); } void onLogoTap() async { final PickedVideo = await ImagePicker().pickVideo( source: ImageSource.gallery ); if(PickedVideo != null){ print("success"); setState(() { this.video = PickedVideo; }); } } BoxDecoration getBoxDecoration(){ return BoxDecoration( gradient: LinearGradient( begin: Alignment.topCenter, end: Alignment.bottomCenter, colors: [ Colors.lightBlue, Colors.black, ], ) ); } } class Name extends StatelessWidget { const Name({super.key}); @override Widget build(BuildContext context) { final textstyle = TextStyle( color: Colors.white, fontSize: 30, fontWeight: FontWeight.w100 ); return Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Text( 'Video', style: textstyle ), SizedBox( //공백 width: 8.0, ), Text( 'Player', style: textstyle.copyWith( fontWeight: FontWeight.w800, ) ), ], ); } } class Logo extends StatelessWidget { final VoidCallback onLogoTap; const Logo({super.key,required this.onLogoTap}); @override Widget build(BuildContext context) { return GestureDetector( child: Image.asset( 'asset/image/logo.png', ), onTap: onLogoTap, ); } } ------------------------------video player 스크린 코드-------- import 'dart:io'; import 'package:flutter/material.dart'; import 'package:image_picker/image_picker.dart'; import 'package:video_player/video_player.dart'; class CustomVideoPlayer extends StatefulWidget { final XFile video; const CustomVideoPlayer({super.key,required this.video}); @override State<CustomVideoPlayer> createState() => _CustomVideoPlayerState(); } class _CustomVideoPlayerState extends State<CustomVideoPlayer> { VideoPlayerController? video_controller; @override void initState(){ // TODO: implement initState super.initState(); InitializeController(); } InitializeController() async { video_controller = VideoPlayerController.file( File(widget.video.path) ); await video_controller!.initialize(); setState(() { }); } @override Widget build(BuildContext context) { if (video_controller == null){ return CircularProgressIndicator(); } return VideoPlayer(video_controller!); } } 수업을 따라가며 코드를 작성하였는데도 동영상을 넣어보면 video_controller가 null값을 가지고 있어 로딩창만 나옵니다. 어디가 잘못된 지 알수 없어 GitHub에 올려주신 완성된 코드를 사용해보았으나 이렇게밖에 나오지 않습니다. 안드로이드나 ios가 아닌 웹으로 실행해서 그런것인가요?

  • flutter
  • 클론코딩
이우진 댓글 1 좋아요 0 조회수 406

에뮬레이터가 창뒤로 안가려지는 방법

미해결

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

화면에서와 같이 동영상 강의중에 보면 화면에 띄워놓은 에뮬레이터가 코드작성시에도 안드로이드 스튜디오 창 뒤로 안가려지고 그대로 유지되고 있는데 어떻게 하는거에요? 저는 가려져서 안스창크기를 조절해서 에뮬레이터를 옆으로 놓고 있어서요...

  • flutter
  • 클론코딩
Rain J 댓글 2 좋아요 1 조회수 451

115강 5분 10초, model의 타입을 ProductModel로 지정했을 때 발생하는 타입 및 null 에러가 있습니다

해결됨

[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!

class ProductPage extends StatelessWidget { const ProductPage({super.key}); @override Widget build(BuildContext context) { return PaginationListView<ProductModel>( provider: productProvider, itemBuilder: <ProductModel>(_, index, ProductModel model) => GestureDetector( onTap: () => context.goNamed( RestaurantDetailPage.routeName, pathParameters: { 'rid': model.restaurant.id, }, ), child: ProductCard.fromProductModel( model: model, ), ), ); } } 여기서 이상한 에러가 뜹니다. 먼저 'rid': model.restaurant.id 이 부분에서는 아래와 같은 에러가 뜹니다. The property 'restaurant' can't be unconditionally accessed because the receiver can be 'null'. Try making the access conditional (using '?.') or adding a null check to the target ('!').dart unchecked_use_of_nullable_value 그리고 두 번째로, ProductCard.fromProductModel(model: model) 에서는 이런 에러가 뜹니다. The argument type 'ProductModel' can't be assigned to the parameter type 'ProductModel'.dart argument_type_not_assignable 두 에러 모두 이해되지 않습니다. ProductModel 타입을 ProductModel 타입으로 Assign할 수 없다니요? 같은 타입인데 이런 에러가 뜹니다. 또한 첫 번째 에러의 경우에도, 분명히 nullable 타입이 존재하지 않는데 nullable 체크를 하라고 하고 있습니다. 당황스럽습니다. 한편, 강의는 이런 식으로 되어 있습니다. itemBuilder: <ProductModel>(_, index, model) 즉 model 의 타입을 따로 지정해주지 않았습니다. 이렇게 했을경우 model의 타입은 dynamic 이 되며, 자동 완성 기능은 수행할 수 없지만, 결론적으로 잘 작동은 합니다. 그런데 왜 저런 이상한 에러가 발생하는 지 모르겠습니다. 여기 이와 관련된 코드를 덧붙입니다. 그러나 대부분 강의와 동일합니다. @JsonSerializable() class ProductModel implements IModelWithId { @override final String id; /// 상품 이름 final String name; /// 상품 상세 정보 final String detail; /// 상품 이미지 URL @JsonKey(fromJson: DataUtils.pathToUrl) final String imgUrl; /// 상품 가격 final int price; /// 레스토랑 정보 final RestaurantModel restaurant; ProductModel({ required this.id, required this.name, required this.detail, required this.imgUrl, required this.price, required this.restaurant, }); factory ProductModel.fromJson(Map<String, dynamic> json) => _$ProductModelFromJson(json); } typedef PaginationWidgetBuilder<T extends IModelWithId> = Widget Function( BuildContext context, int index, T model, ); 문제가 발생하고 있는 스크린샷:

  • flutter
  • 하이브리드-앱
limazero14 댓글 1 좋아요 0 조회수 368

보안 및 content type 질문

미해결

[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!

Token 발급 과정에서 username:password 값을 base64 로 인코딩 후 authorization 헤더에 Basic $token 형태로 전송하는 것이 정석이라고 말씀해주셨습니다. 질문1. Basic $token 형태는 인증정보가 그대로 base64 형태로 인코딩해줍니다. 그러면 누군가가 이 패킷을 까보기만 하면 데이터를 알 수 있는 것이 아닌가요..? 이 부분이 이해가 잘 안되네요. 설명부탁드립니다.. 질문2. 추가로 챗gpt 에게 질문했을 때, 로그인할 때 content type 을 application/x-www-form-urlencoded 형태로 보내라고 하는데, 대부분은 json 형태로 전송하더라구요.. 설명부탁드립니다...

  • flutter
  • 하이브리드-앱
Seung Min Liang 댓글 1 좋아요 0 조회수 435

안녕하세요. 강사님 듣다가 헷갈리는 부분이 있습니다.

미해결

[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!

ref.watch 를 작성하게 되면 ref 값이 변하게 되면 빌드를 다시하는거고 ref.listen 은 값이 변할때 빌드는 다시하지 않지만 값의 상태를 확인하고 이벤트를 실행해주는 것으로 이해해도 될까요?

  • flutter
  • 하이브리드-앱
최민준 댓글 1 좋아요 0 조회수 364

영상통화 강의에서 실기기 2개 사용 문의

해결됨

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

안녕하세요. 영상통화 강의를 끝마치고, 실제 기기 2개(안드로이드, 아이폰)에 같은 코드를 설치해서 실행하면 서로 영상통화가 될 줄 알았는데, 각자 상대방 없음으로 뜨면서, 서로 같은 채널에 입장이 안 되었습니다. Agora SDK 설명서에는 채널이름만 같으면 될 것처럼 써 있었는데 제가 잘못 이해한 것인지... 선생님 설명대로 서버에서 각 기기마다 토큰을 부여 받아야 하므로 기기마다 같은 APP ID에 임시 토큰을 서로 달리 받아야 하는 것인지... 실기기 2개로 영상통화 성공하는 것까지 마무리하고 싶습니다. 선생님께서 힌트를 살짝 주시면 감사하겠습니다.

  • flutter
  • 클론코딩
muzom97 댓글 1 좋아요 0 조회수 340

riverpod 2.0 Notifer 관련하여 질문드립니다

해결됨

[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!

riverpod 2.0에서는 StateNotifier대신 Notifier이나 AsyncNotifier를 사용하라고 되어있던데 그러면 현재 강의에서 StateNotifer를 Notifier로 바꿀려고하니 의존성주입을 할때, StateNotifierProvider에서 생성자로 ref.watch로 authRepository,userMeRepository,storage를 넣어주는데 궁금한것이 1.이를 Notifier에서는 어떻게 넣어주는게 가장 좋은 선택인가요??(생성시에 ref.watch로 한번만 만들기 vs 필요한곳마다 ref.watch사용하기 ) 초기 생성할때 UserModelLoading()을 한뒤에 state업데이트를 getMe함수에서 하는데 이를 try-finally로 하는것이 맞는 방법인가요? late final AuthRepository, late final UserMeRepository, ... 과 같이 final을 붙일시에 다시 build되는 상황이 생기던데 에러가 뜨던데 final을 안해도 괜찮은건가요? 아래는 저가 바꿔본 코드입니다. final userMeProvider = StateNotifierProvider<UserMeStateNotifier,UserModelBase?>((ref) { final authRepository = ref.watch(authRepositoryProvider); final userMeRepository = ref.watch(userMeRepositoryProvider); final storage = ref.watch(secureStorageProvider); return UserMeStateNotifier( authRepository: authRepository, repository: userMeRepository, storage: storage, ); }); class UserMeStateNotifier extends StateNotifier<UserModelBase?> { final AuthRepository authRepository; final UserMeRepository repository; final FlutterSecureStorage storage; UserMeStateNotifier({ required this.authRepository, required this.repository, required this.storage, }) : super(UserModelLoading()) { //내 정보 가져오기기 getMe(); } Future<void> getMe() async { final refreshToken = await storage.read(key: REFRESH_TOKEN_KEY); final accessToken = await storage.read(key: ACCESS_TOKEN_KEY); if (refreshToken == null || accessToken == null) { state = null; return; } final resp = await repository.getMe(); state = resp; } /* *login, logout생략 */ } final userMeProvider = NotifierProvider<UserMeNotifier,UserModelBase?>(UserMeNotifier.new); class UserMeNotifier extends Notifier<UserModelBase?>{ late AuthRepository authRepository; late UserMeRepository repository; late FlutterSecureStorage storage; @override UserModelBase? build() { try{ authRepository = ref.watch(authRepositoryProvider); repository = ref.watch(userMeRepositoryProvider); storage = ref.watch(secureStorageProvider); return UserModelLoading(); }finally{ getMe(); } } Future<void> getMe() async { final refreshToken = await storage.read(key: REFRESH_TOKEN_KEY); final accessToken = await storage.read(key: ACCESS_TOKEN_KEY); if (refreshToken == null || accessToken == null) { state = null; return; } final resp = await repository.getMe(); state = resp; } }

  • flutter
  • 하이브리드-앱
날리는달 댓글 1 좋아요 0 조회수 940

throw 에러 했을때 에러 문구 표시.

미해결

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

현재 VScode에서 하고 있는데, 시뮬레이터 상에서 '카메라 또는 마이크 권한이 없습니다.' 가 뜨지않고, 시뮬레이터는 사진과같이 멈춰진상태에서, 사진과 같이 코드상에서 에러 문구가 뜹니다. 단순히 VScode와 Android Studio 의 차이인가요? 감사합니다.

  • flutter
  • 클론코딩
박지호 댓글 1 좋아요 0 조회수 317

NoSuchMethodError 해결요청

미해결

[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!

강의 3번째 보면서 진행중인데 에러 해결이 안되서 문의올립니다. 강의는 섹션 5-5 레스토랑 상세요청 구현하기 입니다. The relevant error-causing widget was: FutureBuilder<Map<String, dynamic>> FutureBuilder:file:///D:/flutter_project/baemin/lib/restaurant/view/restaurant_detail_screen.dart:39:16 39번 라인은 아래 그림보시면 되겠습니다. - 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 코드팩토리 디스코드 https://bit.ly/3HzRzUM Flutter 강의를 구매하시면 코드팩토리 디스코드 서버 플러터 프리미엄 채널에 들어오실 수 있습니다! 디스코드 서버에 들어오시고 저에게 메세지로 강의를 구매하신 이메일을 보내주시면 프리미엄 채널에 등록해드려요! 프리미엄 채널에 들어오시면 모든 질의응답 최우선으로 답변해드립니다!

  • flutter
  • 하이브리드-앱
Jeongki Choi 댓글 1 좋아요 0 조회수 376

강의에서 작성한 소스코드 github url 은 어디있죠?

미해결

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

강의에서 작성한 소스코드 github url 은 어디있죠?

  • flutter
  • 클론코딩
김곰냥 댓글 2 좋아요 0 조회수 429

Icon Button 의 기능이 Hot restart 이후에도 사용되지 않습니다

미해결

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

Controller 사용해보기에서 알려주신 대로 홈버튼을 만들어 homeURL이 리로드되게 해주었는데 어떤 웹사이트를 이용하던 혹은 재실행을 하던 새로고침이 되지 않습니다. 혹시 이런 경우는 캐시의 문제가 있어서일까요? 아니면 어떠한 문제 때문일까요?? 아래에 제 코드를 첨부하겠습니다. import 'package:flutter/material.dart'; import 'package:webview_flutter/webview_flutter.dart'; class HomeScreen extends StatelessWidget { WebViewController? controller; final homeURL = "https://www.webtoons.com/en/"; HomeScreen({super.key}); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("ryaotuix's portfolio"), centerTitle: false, backgroundColor: Colors.blueAccent, actions: [ IconButton( onPressed: () { if (controller == null) { return; } // controller cannot be null for sure controller!.loadUrl(homeURL); }, icon: Icon( Icons.home, ), ) ], ), body: WebView( // create new controller to class's controller onWebViewCreated: (WebViewController controller) { this.controller; }, initialUrl: homeURL, javascriptMode: JavascriptMode.unrestricted, ), ); } }

  • flutter
  • 클론코딩
  • icon
returnzmagic 댓글 1 좋아요 0 조회수 481

인기 태그

인프런 TOP Writers

주간 인기글