묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[코드팩토리] [중급] 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로 SNS 앱 만들기
Mac개발,VSCode개발 하시는분들 iOS 대응 문제 참고하세요
강사님께서 ios대응은 준비중이라 하셔서 맥은 안되나했는데제가 맥 vscode로 ios시뮬레이터 사용해서 강의 마쳤는데별 이상 없었습니다. 다만 사진첩권한을 허가해줘야 되는데ios>Runner>info.plist 파일에서 <key>NSPhotoLibraryUsageDescription</key> <string>사진첩 권한을 허가해주세요.</string> <key>NSCameraUsageDescription</key> <string>카메라 권한을 허가해주세요.</string> <key>NSMicrophoneUsageDescription</key> <string>마이크 권한을 허가해주세요.</string>해당 권한코드를 추가해주시면 됩니다.또 저는 임펠러엔진 관련 체크메세지가 떳었는데 <key>FLTEnableImpeller</key> <true/>까지 추가해주시면 됩니다.그리고 문제 창에BuildContext관련 참고에러 메세지가 엄청나게 뜰텐데이건 강의의 상태관리를 프로바이더를 사용해서context.어쩌고 하는 코드들이 많아서 그렇습니다.해결방법은 프로바이더 호출을 변수에 따로 담아서 불러오면 되는데 크리티컬한 문제는 아니라 작동은 됩니다. 그래도 강사님께서 상태관리를 RiverPod으로된 리뉴얼된 강의를 제작해주신다면 더 좋지 않을까 싶긴한데.. 이건 미래의 교육생분들과 강사님께 맡기겠습니다 열심히 공부하세요 화이팅.
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
emulator 실행 오류 문의
안녕하세요 애뮬레이터 실행이 불가해서 이틀 째 골머리를 앓다가 문의드립니다 😂 emulator 실행 시에 디바이스 선택이 안돼서<no device selected> 만 계속 뜨고있는 상황입니다.에뮬레이터는 실행이 되더라도 run이 불가능하고 계속 무한 로딩만 되고 있는 상태입니다.. 재부팅을 하더라도 동일한 증상이 반복됩니다! 에뮬레이터 화면상에 작성한 코드도 적용이 안되고 있습니다현제 셋팅된 값도 같이 첨부하겠습니다!Chrome (web)으로 실행시에는 정상적으로 작동이 되어서 우선은 웹으로 공부하고있습니다.. ㅠㅠ
-
미해결Flutter 입문 - 안드로이드, iOS 개발을 한 번에 (with Firebase)
애뮬레이터 Intel HAXM 다운로드가 안돼요
데스크탑에서는 강의처럼 잘 되었는데, 노트북에서는 안되네요.. 따로 Intel HAXM을 따로 다운 받았는데도 안되네요... 왜이럴까요?ㅠㅠㅠ제어판 보시면, Intel HAXM 이 설치되어있는데도 작동이 잘 안되네요..답변부탁드립니다. 감사합니다.
-
해결됨Flutter로 SNS 앱 만들기
플러터에서 forEach문 보다 for룹을 사용을 권장하는 문제와 context 바로사용으로 체크메세지가 많이 뜨시는분들
안녕하세요 강의 잘보고있습니다.그런데 vs코드가 삭제로직에 사용된 2군데의 forEach 룹중 한군대의 forEach룹을 자동으로 for in 룹으로 변경하길레 살펴보니 플러터에서는 forEach문 사용이 권장되지 않는다는걸로 보입니다. 예를들어 삭제함수의 void _deleteImage(List<String> imageUrls) { imageUrls.forEach((element) async { await firebaseStorage.refFromURL(element).delete(); }); }의 코드는 void _deleteImage(List<String> imageUrls) async { for (String imageUrl in imageUrls) { await firebaseStorage.refFromURL(imageUrl).delete(); } } 로 수정하면 되는것 같네요. 또 VSCode에서 context를 함수바디에 바로 사용하는 문제로 체크메세지가 너무 많이 뜨는데대표적으로 feed_card_widget.dart 파일 삭제버튼의 onPressed:(){} 내에 LikeProvider,ProfileProvider를 호출하는 부분들의 context를 바로 사용하는것보다 final likeProvider = context.read<LikeProvider>();이런식으로 변수에 담아서 호출하는 방식을 사용하라는 것 같습니다. 큰문제는 아닌데 강의보시는분들 참고하세요
-
해결됨Flutter로 SNS 앱 만들기
섹션7 게시글목록화면 _게시글정보 가져오기
섹션7 게시글목록화면 _게시글정보 가져오기에서 상태관리 하고 있는 게시글의 데이터 출력 메세지가 달라서요..강의 화면과 저랑 달리 나와서요강의사진제 컴퓨터사진logger가 안 먹고 있는거죠..압축파일 보냈어요..
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
오늘도 출근 세팅하기 iOS 배포 버전 요구
안녕하세요! 강의 잘 듣고 있습니다!오늘도 출근 - 근태관리 앱 만들기의 세팅하기 챕터에서 진행하신 과정을 모두 완료하고 나서 나온 오류입니다!"google_maps_flutter"와 "geolocator"의 플러그인 버전도 영상과 동일하게 진행했습니다! 저는 이것을 현재의 CocoaPods가 구글맵 플러그인과 호환이 되지않기 때문에 배포 버전을 올려야한다고 생각했습니다.그래서 아래의 사진에서 알려주는 사이트를 접속하여 아래와 같이 진행하였습니다. 프로젝트의 ios/Flutter/AppFrameworkInfo.plist에 들어간다음기존에 MinimumOSVersion이 12.0인 것을14.0으로 바꾸어도 보았지만 오류는 기존과 동일했습니다. 어떻게 해결할 수 있을까요?...
-
미해결처음하는 플러터(Flutter) 기초부터 실전까지 [풀스택 Part4] (쉽고 견고하게 단계별로 다양한 프로젝트까지)
질문있습니다.
- 강의 Row,Coloum 기본과 MaterialApp듣고 있습니다똑같이 짯는데 왜 색깔이 안들어갈까요?그리고 글자가 가운데로 정렬은 코드에 없는데 왜 되는거죠??
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
border 속성
다른분들께 비슷한 답변 주신것들 모두 읽었는데요.. 아무리 해도 이해가 안가서요... 강의에서요 border속성은 기본 속성이라고 하셨으니 focusedBorder, enabledBorder, disabledBorder, errorBorder, focusedErrorBorder 의 기본 속성이라고 생각합니다. 그럼 예제에 focusedBorder, 를 입력하기 전에는 border 속성을 가져야 하는 거 아닌가요?또한 enabledBorder도 입력하기 전에는 border 속성을 가져야 하는 거 아닌가요? 마치 border은 작동을 안하는 거 처럼 보여집니다. 그래서 기본 속성이라는 말이 이해가 안갑니다. 적용이 안되는 기본 속성이라는건 없으니까요 . 이해가 안가서 질문을 남깁니다...! ㅠㅠ 선생님...!
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
Android api 34가 존재하지 않습니다
안녕하세요!! 안드로이드 스튜디오 설치 후 강의따라 설정중인데제 컴퓨터에는 강좌에서 말씀하신 android api 34 가 존재하지 않더라구요해당 api가 없어도 강의를 진행하는데 문제가 없는지문제가 있다면 어떻게 설치할 수 있을까요? 궁금합니다!
-
미해결[코드팩토리] [중급] 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'] 와 같이 생성이 될 수 있도록 커스터마이징 할 수 있을까요?
-
해결됨Slack 클론 코딩[백엔드 with NestJS + TypeORM]
socket io 미 연결 문제 (nest & flutter)
안녕하세요! socket관련한 서비스를 진행해보고 싶어서 제로초님의 강의를 들은 수강생입니다.현재 nest & flutter를 이용하고 있는데, flutter에서의 연결 및 다른 tool에서 socket io 연결이 되지 않으며 “외부 사이트로는 접근이 불가능한 오류”가 생겨서 조심스럽게 여쭤봅니다. 현재 로직은 채팅을 생성시, 채팅을 보여주는 리스트가 실시간으로 새로고침이 되는 부분을 작업중입니다.하지만, postman, httpie, hoppscotch의 부분에서 연결이 되지 않는 문제가 발생합니다.많은 방법을 찾아봤지만, 터미널에서 socket io cli를 통해서 로그는 볼 수 있지만, 다른 tool에서는 이용이 불가능한 방법에 대해서 알고 싶어서 질문드립니다!Socket io를 통해서 local, dev서버 연결 완료 하지만 postman의 socket io기능을 통해서 테스트를 진행하려고 할 때,postman으로 연결local에서는 문제가 없이 연길이 되지만, dev서버에서는 이러한 에러가 발생합니다. 또한 flutter 앱에서 연결을 하려면 다음과 같은 에러가 발생합니다.오류 메시지 "WebSocketException: Connection to 'http://~~~~.com:81/socket.io/?EIO=4&transport=websocket#' was not upgraded to websocket"는 클라이언트가 WebSocket 연결을 시도하였으나, 서버가 해당 연결을 WebSocket 프로토콜로 업그레이드하지 않았다는 것을 의미합니다. 이는 여러 가지 원인에 의해 발생할 수 있습니다: upgrade가 되지 않았다고 나와서 ,ngnix의 socket 부분에서 upgrade부분도 잘 넣어줬는데, 오류가 해결되지 않아서... 고민 끝에 질문 올립니다.Ngnix 설정부터 2주정도 시간을 들였지만, 해결이 되지 않아서…여쭤봅니다.방화벽도 해제가 되어 있는데 연결이 안되고 있습니다..다음은 nest에서 작성한 코드 입니다![chat.gateway.ts]import { WebSocketGateway, WebSocketServer, SubscribeMessage, OnGatewayConnection, OnGatewayDisconnect, OnGatewayInit, ConnectedSocket, MessageBody, } from '@nestjs/websockets'; import { Server, Socket } from 'socket.io'; @WebSocketGateway() export class ChatGateway implements OnGatewayInit, OnGatewayConnection, OnGatewayDisconnect { @WebSocketServer() server: Server; afterInit(server: Server) { console.log('WebSocket initialized'); } handleConnection(client: Socket) { console.log(`Client connected: ${client.id}`); // 수정: client 객체 직접 출력 대신 id 출력 } handleDisconnect(client: Socket) { console.log(`Client disconnected: ${client.id}`); } @SubscribeMessage('sendMessage') handleMessage( @ConnectedSocket() client: Socket, @MessageBody() data: { message: string } ): void { console.log(`Received message from ${client.id}: ${data.message}`); this.server.emit('newMessage', data); // 모든 클라이언트에게 메시지 전송 console.log(`Received message: ${data.message}`); } } [main.ts]import { ConfigService } from '@nestjs/config'; import { NestFactory } from '@nestjs/core'; import { NestExpressApplication } from '@nestjs/platform-express'; import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; import { join } from 'path'; import { AppModule } from './app.module'; import { HttpExceptionFilter } from './common/exceptions/http-exception.filter'; import { SuccessInterceptor } from './common/interceptors/success.interceptor'; import { IoAdapter } from '@nestjs/platform-socket.io'; import { CustomIoAdapter } from './adapters/custom-io.adapter'; async function bootstrap() { const app = await NestFactory.create<NestExpressApplication>(AppModule); app.useWebSocketAdapter(new CustomIoAdapter(app)); const configService = app.get(ConfigService); const port = configService.get('server.port'); const mongoUrl = configService.get('DB.MONGO_URL'); console.log('MongoDB URL:', mongoUrl); app.enableCors({ origin: true, credentials: true, }); app.useStaticAssets(join(__dirname, '..', 'client'), { prefix: '/api/v1/client', }); app.useGlobalInterceptors(new SuccessInterceptor()); app.useGlobalFilters(new HttpExceptionFilter()); app.setGlobalPrefix('api/v1'); const swagger_options = new DocumentBuilder() .setTitle('Nyam-Docs') .setDescription('API description') .setVersion('2.0.1') .addApiKey( { type: 'apiKey', name: 'x-token', in: 'header', description: 'Enter token', }, 'x-token', ) .addApiKey( { type: 'apiKey', name: 'x-type', in: 'header', description: 'Enter type', }, 'x-type', ) .build(); const document = SwaggerModule.createDocument(app, swagger_options); SwaggerModule.setup('api-docs', app, document); await app.listen(port, '0.0.0.0'); console.log(`Application Listening on Port : ${port}`); } bootstrap();다음은 custom한 io입니다[custom.io.adpter.ts]import { IoAdapter } from '@nestjs/platform-socket.io'; import { INestApplication, Injectable } from '@nestjs/common'; import { ServerOptions } from 'socket.io'; @Injectable() export class CustomIoAdapter extends IoAdapter { constructor(app: INestApplication) { super(app); } createIOServer(port: number, options?: ServerOptions): any { const serverOptions: ServerOptions = { ...options, cors: { origin: '*', // 모든 도메인에서 접근 허용 methods: ['GET', 'POST', 'PUT', 'DELETE'], credentials: true }, transports: ['websocket', 'polling'], //pooling 없으면 연결 안 됨(socket) allowEIO3: true // Engine.IO 3.x 버전 클라이언트 허용 }; return super.createIOServer(port, serverOptions); } } 혹시 해결방법을 아시거나, 도움을 주실만한 정보가 있으시다면 알려주시면 정말 감사하겠습니다!
-
미해결[플러터플로우]코딩 없이 한 달 만에 앱 만들기
Component Parameters로 데이터 가져올때 질문입니다.
안녕하세요! Post데이터를 가져올때 DocumentReference로 가져오는경우와 Document로 가져오는경우에는 어떤 차이가 있나요?Document로 가져오는경우에 Toggle Value에 값을 설정할 수 없는 문제가 있더라구요.. 공식문서를 뒤져봐도 잘 알 수 없어서 질문 남겨 놓습니다. 감사합니다.
-
해결됨[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
애뮬레이터 화면 출력 문의
생성한 virtual device 가 실행은 되는 것 같은데 출력이 한번도 제대로 되지 않습니다. 홈화면 메뉴화면만 왔다갔다 잘 하는데 작성한 코드가 실행되지 않습니다.flutter doctor 터미널에 입력해봤을 때나 변수 설정이나 다 문제가 없었습니다.. ㅠㅠ
-
해결됨[플러터플로우]코딩 없이 한 달 만에 앱 만들기
리스트뷰에서 qurey해온 데이터들 소팅에 질문있습니다.
안녕하세요!리스트뷰로 firebase에서 데이터를 불러와 이름과 이미지를 나열하는데요. 이게 등록된 순서로 소팅되지 않는것 같아 문의 드립니다. 글이 등록된 시간순으로 소팅하는 방법이 있을까요?
-
미해결[코드팩토리] [중급] 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) 기초부터 실전까지 [풀스택 Part4] (쉽고 견고하게 단계별로 다양한 프로젝트까지)
강의 노트를 보고 싶은데 어디서 봐야되요.
강의노트... 못 찾겠습니다.
-
미해결Flutter 초입문 왕초보편
안드로이드 앱 핑테스트
안녕하세요.강의를 듣고 개인적으로 앱을 제작하고 있는데요.핑 테스트하는 모바일앱입니다.dart.dev에서 ping_dart라는 패키지를 이용해서 제작하고 있는데오류가 발생하고 있습니다.혹시 도움을 받을 수 있을까요?cmd에서 구글로 핑은 잘 나갑니다..import 'package:flutter/material.dart'; import 'package:dart_ping/dart_ping.dart'; class Screen2WebList extends StatelessWidget { const Screen2WebList({super.key}); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("핑테스트", textAlign: TextAlign.left,), titleTextStyle: const TextStyle( color: Colors.white, fontSize: 20, ), backgroundColor: Colors.blue, ), body: Column( children: [ Container( height: 100, width: 100, alignment: Alignment.center, child: TextButton(onPressed: () { startPing(); }, child: Text("CLICK"), ) ), ], ), ); } startPing() async { final ping = Ping('google.com', count: 5); ping.stream.listen((event) { print(event.error); }); } }오류메세지 I/flutter (23733): requestTimedOut I/flutter (23733): requestTimedOut I/flutter (23733): requestTimedOut I/flutter (23733): requestTimedOut I/flutter (23733): null
-
미해결[코드팩토리] [중급] 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}'); }혹시 이런식으로 함수를 통한 접근은 아예 불가능한 건가요?ㅠㅠ