173만명의 커뮤니티!! 함께 토론해봐요.
미해결
[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
stateless widget 같은 경우에는 상태가 변경되지 않고, 변경될 시에는 stateless widget이 새롭게 생성된다고 알고있는데요! 다음과 같이 버튼이 눌린 상태에 따라 버튼의 색깔이 바뀌는 경우에는 widget에 대한 상태 변화는 따로 나타나지 않는다고 보면될까요? 아니면 이 경우에도 버튼 색깔이 바뀔때마다 widget이 새롭게 생성되는 건가요?
김영호
2023-08-17T14:09:34.351Z
댓글 1
좋아요 0
조회수 323
미해결
Flutter 중급 1편 - 클린 아키텍처
마지막에 main 함수는 Provider 설정 이후, RunApp 함수가 실행이 되는 걸로 보입니다. 만약 Provider 초기화시 외부 DB와 통신하는 등의 통신시간이 길어진다면... runApp 이 실행되기 전이라서 어플이 동작하지 않을 수 있나요?
Seung Min Liang
2023-08-17T02:47:29.310Z
댓글 1
좋아요 0
조회수 320
미해결
[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
전체적으로이해가안가서그러는데 객체지향을 더봐야겠죠.함수편을봐야하나요.어느부분을봐야하나요
vadain2000
2023-08-16T16:28:22.224Z
댓글 2
좋아요 0
조회수 418
미해결
Flutter + Firebase로 넷플릭스 UI 클론 코딩하기 [무작정 플러터]
pubspec.yaml 파일도 수정해보고, 강사님 한대로 코드 똑같이 적었는데.. 이미지가 안불러와져요. 오타 있는지 확인도 해보았는데 없었어요 home_screen.dart import 'package:flutter/material.dart'; class HomeScreen extends StatefulWidget { const HomeScreen({super.key}); @override _HomeScreenState createState() => _HomeScreenState(); } class _HomeScreenState extends State<HomeScreen> { @override void initState() { super.initState(); } @override Widget build(BuildContext context) { return const TopBar(); } } class TopBar extends StatelessWidget { const TopBar({super.key}); @override Widget build(BuildContext context) { return Container( padding: const EdgeInsets.fromLTRB(20, 7, 20, 7), child: Row( children: <Widget>[ Image.asset( 'assetsimages\bbongflix_logo.png', fit: BoxFit.contain, height: 25, ), ], ), ); } }
ide2938
2023-08-16T13:29:28.407Z
댓글 1
좋아요 1
조회수 592
미해결
[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
클래스 1번 GestureDetector( onTap: () { Schedule.onTap(context); }, ---------------------------------------------- 클래스 2번 class Schedule { static void onTap(BuildContext context) async { (데이터불러오기) return AlertDialog 입니다. 약간에 변형을 줘서 공부중인데 1번클래스에서 온탭 누르면 알림창은 문제 없이 뜨고있습니다 그러나 onTab 밑에 빨간줄이 영~신경쓰이는데 마우스 대보면 The method 'onTap' isn't defined for the type 'Schedule 이렇게 나오는데 관련 자료 부터 구글 다뒤져봐도 onTab에 빨간줄이 안사라집니다 방법좀 알려주세요 ㅠ
염호경(hokki)
2023-08-16T09:26:14.410Z
댓글 1
좋아요 0
조회수 303
해결됨
Flutter 중급 3편 - 의존성 주입 가이드
안녕하세요. 코드를 작성하다가 궁금증이 생겨 질문을 올립니다. 사용자 입장에서 인터넷이 되나 안되나 비슷한 경험을 제공하려고 합니다. 아래 데이터 흐름을 예로 들겠습니다. 뷰모델 학교 디테일 정보 fetch use case 학교 repository(interface fetch) remote data source - 학교repository확장 local data source - 학교 repository 확장 이런 상황에서 인터넷이 되면 4번에서 데이터를 가져오고 안되면 5번에서 가져오려고 합니다. 이럴때 인터넷이 되는지 안되는 지 판단하는 클래스는 use case 내 execute 안에서 하는 것이 옳은지 아니면 use case 와 data source 사이에 로컬 및 리모트 데이터 소스를 주입 받는 새로운 클래스를 새로만드는 것이 옳은지 아니면 다른 접근이 있는 지 궁금합니다. 또한 인터넷이 안되는 것 뿐만 아니라 인터넷이 되는 상황에서도 로컬의 값과 서버의 값이 같으면 로컬 데이터를 사용하도록 하고 싶은데 어디 클래스에서 어떤 방식으로(더티비트?) 구현하는 것이 좋을 지 궁금합니다. 감사합니다.
flutter mvvm provider 클린-아키텍처 dependency
김보겸
2023-08-16T08:07:52.802Z
댓글 2
좋아요 0
조회수 353
미해결
[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
원래 drawer 색상 변경하기 전에 스크롤컨트롤러 부분까지는 아무 문제 없었는데, 이제 futurebuilder안에 Scaffold를 넣고 나니까 restart 했을 때 '에러가 있습니다.'라고 뜹니다. 프로젝트상에는 에러가 하나도 없는 상태입니다. 혹시 몰라서 drawer 색상 변경 수정 전으로 코드를 돌려봐도 여전히 '에러가 있습니다.'라고 뜹니다. 정부 api를 받아오는데 문제가 발생한 경우인가요? api에서 에러가 발생하면 이 에러를 어떻게 확인할 수 있나요?
zla_db
2023-08-16T07:58:22.534Z
댓글 1
좋아요 0
조회수 283
해결됨
Flutter 중급 3편 - 의존성 주입 가이드
안녕하세요. 수업 잘 듣고 있습니다. 로그인 관련 부분을 구현하다가 궁금증이 생겨 질문드립니다. get 방식으로 약국의 마스크 수량을 가져오는 것은 약국 ViewModel 약국 UseCases fetch 마스크 수량 UseCase 마스크 Repository 마스크 (Local or Remote) Data Source 위의 과정으로 이해를 했습니다. 그런데 (학생)로그인 부분을 구현한다고 가정하면 로그인 ViewModel 로그인 UseCases fetch 학교목록 UseCase 학교목록 Repository 학교목록 (Local or Remote) Data Source post 로그인 입력정보 UseCase 로그인 Repository 로그인 Remote Data Source 이러한 흐름으로 진행하게 되는데 여기서 질문이 있습니다. 로그인 할 때 서버에서 제공하는 학교 목록을 받고 그 목록을 토대로 로그인을 하는 방식일 때 UseCase 를 저런 방식으로 설정하면 되는 것인지 repository 하면 뭔가 특정 데이터에 대한 CRUD 를 의미하는 것 같은데 로그인 정보를 제출하는 것도 이런식으로 처리해도 되는지 궁금합니다!
flutter mvvm provider 클린-아키텍처 dependency
김보겸
2023-08-15T07:18:10.968Z
댓글 1
좋아요 0
조회수 277
해결됨
[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
아래와 같은 빨간색 오류 메시지가 뜹니다. 확인 부탁드립니다^^
권부영
2023-08-15T04:27:06.092Z
댓글 1
좋아요 1
조회수 286
미해결
[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
children: [1,2,3] 을 다른 파일로 넘길때 [1,2,3] 을 변수로 바꾸고상단에 final List<Widget> children; required this.children, 이렇게 넘기는데요. 받는건 return 클래스명 ( childtrn : [1,2,3]) [1,2,3] 말고 1만 넘기고/받고 싶으면 어떻게 해야하나요?
View K
2023-08-15T00:08:55.824Z
댓글 1
좋아요 0
조회수 224
해결됨
[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
위와 같이, 가상폰화면 상단에 기본적으로 보여야 하는 시간정보, 전파아이콘, 배터리아이콘이 보이지 않아요. 왜 그런걸까요?
권부영
2023-08-14T10:39:19.574Z
댓글 1
좋아요 1
조회수 387
미해결
[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
http와 https 사용할수있게 코드 추가 하였으나 다음 에러발생되었습니다.
vadain2000
2023-08-14T08:13:44.711Z
댓글 1
좋아요 0
조회수 273
미해결
[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
안드로이드 스튜디오를 순서대로 깔았는데 자동완성이 제대로 시행되지 않고 있습니다. Control+SpaceBar를 눌러야만 자동완성이 뜨고 있어요,, 그냥 입력만 해도 자동완성을 띄우고싶은데 방법이 없을까요?
flutter 클론코딩 자동완성 androidstudio
규현김
2023-08-14T07:26:28.865Z
댓글 1
좋아요 0
조회수 590
미해결
[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
const HomeScreen({super.key}) 에러 발생되었습니다. StatelessWidget 하면 const HomeScreen({super.key}); 자동으로const가 생성되는데요. 지우면 에러가 없어집니다. 무슨 이유인가요?
vadain2000
2023-08-14T05:51:29.798Z
댓글 1
좋아요 0
조회수 341
미해결
[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
Button 길이를 정의할 때 MediaQuery랑 double.infinity 둘 중 어떤 것을 사용하는게 더 좋을까요?
이우길
2023-08-14T00:36:47.309Z
댓글 1
좋아요 0
조회수 259
미해결
[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
webview 강의 진행중입니다. 그냥 진행할까요? 그냥 돌아가서 진행했습니다. 결과는 나왔네요. 빨강색 에러는 뭔가요
vadain2000
2023-08-13T18:07:54.243Z
댓글 2
좋아요 0
조회수 536
해결됨
[Bloc 응용] 실전 앱 만들기 (책 리뷰 앱) : SNS 로그인, Firebase 적용, Bloc 상태 관리, GoRouter
개남님 좋은 강의 감사합니다. 현재 초기 페이지 연결하기까지 진행했습니다. 조금 오류가 있는 것 같은데 순수하게 궁금해서 여쭙니다! main.dart에서 AppDataLoadCubit을 lazy:false로 뒀잖아요? 그럼 앱을 처음 다운 받았을 때 init page가 보여지고 lazy가 false이기 때문에 스플래시 화면에 도달하기 전 이미 데이터를 로드해서, 시작하기 버튼을 눌러 스플래시 화면에 도달했을 때면, 바로 로그인 체크 중 입니다..가 보여야 하는 것 아닌가요?? 제 에뮬레이터에는 데이터 로드 중 입니다..가 보이길래 영상을 다시 돌려봤는데 개남님도 같은 현상이십니다. 그리고 시작하기 버튼을 통해 init -> splash에 도달했을 때 새로고침하지 않으면 데이터 로드 중 입니다..에서 로그인 확인 중 입니다..로 바뀌지 않습니다. 단순 오류인가 해서 앱을 지워 hydrated bloc을 초기화하고 다시 확인해 보았지만 같은 현상이 일어납니다.
박진혁
2023-08-13T11:58:35.140Z
댓글 2
좋아요 0
조회수 359
해결됨
[Bloc 응용] 실전 앱 만들기 (책 리뷰 앱) : SNS 로그인, Firebase 적용, Bloc 상태 관리, GoRouter
개남님 좋은 강의 감사합니다. equatable을 계속 사용하셔서 알아봤는데 잘 이해되지 않습니다. 클래스 인스턴스 비교에 활용된다는 것과, 그 원리는 이해했는데, 모델 클래스랑 관련이 있나요??
박진혁
2023-08-13T08:18:19.074Z
댓글 1
좋아요 0
조회수 387
미해결
[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
Expanded에서 flex를쓰면 전체적인 비율에 적용되는건 이해했습니다. Flexible 적용하면 container안에 heigth크기를 잡아먹고 나머지는 빈공간으로 되는데요. flex 적용하면 헷갈립니다. 구체적인 예좀 들어주세요 버리는공간이 많아 지잖아요. 왜 많아지는지 모르겠습니다.
vadain2000
2023-08-13T07:43:34.307Z
댓글 1
좋아요 0
조회수 577
해결됨
[코드팩토리] [중급] 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); } }
limazero14
2023-08-12T17:48:35.590Z
댓글 1
좋아요 0
조회수 415