묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결Flutter 초입문 왕초보편
13강 예제파일 오류
main.dart 내 기본 코드가 선생님의 화면과 다릅니다. 삭제한 주석 내용도 그렇구요. 다른 이유가 있을까요? 그래서 그런지 오류가 발생합니다.
-
미해결Flutter 초입문 왕초보편
13강. 실행 시 Gradle 설정 오류
Main.dart를 실행 시, 아래와 같이 오류가 발생합니다.================================================================Launching lib\main.dart on sdk gphone64 x86 64 in debug mode...Running Gradle task 'assembleDebug'...FAILURE: Build failed with an exception.* Where:Settings file 'C:\Users\pc\StudioProjects\first_flutter\android\settings.gradle' line: 20* What went wrong:A problem occurred evaluating settings 'android'.> Could not read script 'C:\Users\pc\OneDrive\?��???? ?????��\????��?\flutter\packages\flutter_tools\gradle\app_plugin_loader.gradle' as it does not exist.* 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.orgBUILD FAILED in 4sException: Gradle task assembleDebug failed with exit code 1=================================================================setting에서 Gradle user home 도 아래와 같이 설정했는데, 어떤 문제가 있을까요?
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
로그인 시 resp 데이터 타입 에러 codec
디스코드 dm으로 프리미엄 채널 문의 드렸는데 초대가 안된것 같아서 여기에 질문드려요! 11:05 초 강의 처럼 resp.data하려고 하지만, 저는 에러 렌즈때문에 debugPrint로만 찍어야 run이 가능합니다. 그래서 코드는 아래 resp 함수를 다 지우고 debugPrint하면 토큰은 잘 나오지만, 아래처럼 하고 debugPrint(resp.data)를 하면 아래와 같은 에러가 발생합니다.저 코덱 뒤에가 다이내믹 타입이라는 그런거 때문이거 같습니다. 버전도 동일하게 일부러 맞춰봤는데도 그런거보면.. 이상하게 왜 강의에서는 에러가 안났을까요? 흠 ..
-
미해결Flutter 초입문 왕초보편
13강 예제파일 실행 시 오류
13강 예제파일로 실행 시 아래 오류가 발생하는데 문제가 뭘까요? (사람이 문제겠죠?) 소스코드 :import 'package:flutter/material.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({Key? key}) : super(key: key); // This widget is the root of your application. @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( primarySwatch: Colors.blue, ), home: const MyHomePage(), ); } } class MyHomePage extends StatefulWidget { const MyHomePage({Key? key}) : super(key: key); @override State<MyHomePage> createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { @override Widget build(BuildContext context) { return Container(); } } 에러Launching lib\main.dart on sdk gphone64 x86 64 in debug mode...Running Gradle task 'assembleDebug'...FAILURE: Build failed with an exception.* What went wrong:A problem occurred configuring root project 'android'.> Could not resolve all files for configuration ':classpath'. > Could not resolve org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.10. Required by: project : > Could not resolve org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.10. > Could not get resource 'https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-gradle-plugin/1.7.10/kotlin-gradle-plugin-1.7.10.pom'. > Could not GET 'https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-gradle-plugin/1.7.10/kotlin-gradle-plugin-1.7.10.pom'. > The server may not support the client's requested TLS protocol versions: (TLSv1.2, TLSv1.3). You may need to configure the client to allow other protocols to be used. See: https://docs.gradle.org/7.5/userguide/build_environment.html#gradle_system_properties (중략) * 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.orgBUILD FAILED in 4s[!] Gradle threw an error while downloading artifacts from the network.Exception: Gradle task assembleDebug failed with exit code 1
-
미해결Flutter 초입문 왕초보편
잘 되던 에뮬레이터 실행 오류
잘 실행되던 에뮬레이터가 갑자기 에러가 발생합니다.아래 질문에 링크 주신 내용으로 해도 안되네요. 2023-10-11 11:40:48,622 [ 565376] INFO - Emulator: Pixel 6 API 31 - C:\dev\sdk\emulator\emulator.exe -netdelay none -netspeed full -avd Pixel_6_API_312023-10-11 11:40:48,667 [ 565421] INFO - Emulator: Pixel 6 API 31 - Android emulator version 32.1.15.0 (build_id 10696886) (CL:N/A)2023-10-11 11:40:48,667 [ 565421] INFO - Emulator: Pixel 6 API 31 - Found systemPath C:\dev\sdk\system-images\android-31\google_apis\x86_64\2023-10-11 11:40:48,754 [ 565508] WARN - Emulator: Pixel 6 API 31 - Please update the emulator to one that supports the feature(s): Vulkan2023-10-11 11:40:48,811 [ 565565] WARN - Emulator: Pixel 6 API 31 - Failed to process .ini file C:\dev\androidavd\Pixel_6_API_31.avd\quickbootChoice.ini for reading.2023-10-11 11:40:52,113 [ 568867] INFO - Emulator: Pixel 6 API 31 - Process finished with exit code -1073741819 (0xC0000005)2023-10-11 11:40:52,114 [ 568868] SEVERE - Emulator: Pixel 6 API 31 - Emulator terminated with exit code -1073741819java.lang.Throwable: Emulator terminated with exit code -1073741819 at com.intellij.openapi.diagnostic.Logger.error(Logger.java:202) at com.android.tools.idea.avdmanager.EmulatorProcessHandler$ConsoleListener.onTextAvailable(EmulatorProcessHandler.kt:89) at jdk.internal.reflect.GeneratedMethodAccessor42.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at com.intellij.execution.process.ProcessHandler$2.invoke(ProcessHandler.java:248) at jdk.proxy1/jdk.proxy1.$Proxy44.onTextAvailable(Unknown Source) at com.intellij.execution.process.ProcessHandler.notifyTextAvailable(ProcessHandler.java:222) at com.intellij.execution.process.ProcessTerminatedListener.processTerminated(ProcessTerminatedListener.java:54) at jdk.internal.reflect.GeneratedMethodAccessor283.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at com.intellij.execution.process.ProcessHandler$2.invoke(ProcessHandler.java:248) at jdk.proxy1/jdk.proxy1.$Proxy44.processTerminated(Unknown Source) at com.intellij.execution.process.ProcessHandler.lambda$notifyTerminated$2(ProcessHandler.java:206) at com.intellij.execution.process.ProcessHandler$TasksRunner.execute(ProcessHandler.java:281) at com.intellij.execution.process.ProcessHandler.notifyTerminated(ProcessHandler.java:189) at com.intellij.execution.process.ProcessHandler.notifyProcessTerminated(ProcessHandler.java:185) at com.intellij.execution.process.BaseProcessHandler.onOSProcessTerminated(BaseProcessHandler.java:61) at com.intellij.execution.process.BaseOSProcessHandler$1.lambda$startNotified$0(BaseOSProcessHandler.java:98) at com.intellij.execution.process.ProcessWaitFor.lambda$new$0(ProcessWaitFor.java:45) at com.intellij.util.ConcurrencyUtil.runUnderThreadName(ConcurrencyUtil.java:212) at com.intellij.execution.process.ProcessWaitFor.lambda$new$1(ProcessWaitFor.java:23) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(Executors.java:702) at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(Executors.java:699) at java.base/java.security.AccessController.doPrivileged(AccessController.java:399) at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1.run(Executors.java:699) at java.base/java.lang.Thread.run(Thread.java:833)2023-10-11 11:40:52,115 [ 568869] SEVERE - Emulator: Pixel 6 API 31 - Android Studio Giraffe | 2022.3.1 Patch 2 Build #AI-223.8836.35.2231.108116362023-10-11 11:40:52,115 [ 568869] SEVERE - Emulator: Pixel 6 API 31 - JDK: 17.0.6; VM: OpenJDK 64-Bit Server VM; Vendor: JetBrains s.r.o.2023-10-11 11:40:52,115 [ 568869] SEVERE - Emulator: Pixel 6 API 31 - OS: Windows 102023-10-11 11:40:52,683 [ 569437] WARN - #com.android.tools.idea.avdmanager.AvdManagerConnection - Unable to determine if Pixel_6_API_31 is online, assuming it's not
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
세션2 Dio로 Auth API요청해보기 질문
세션2 Dio로 Auth API요청해보기 이전강의까지 실행후에,서버 작동하는거 다확인했습니다. 문제없었습니다. http://127.0.0.1:3000/api 도 잘들어가졌습니다서버 설정은 actual 플러터프로젝트 파일 말고,delivery_server라는 플러터프로젝트 파일을 만들어 작업했습니다. 본강의부분에서 플러터에 작업하려고 acual 프로젝트로 넘어갔고 강의부분 작업을 다한후에~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~print(resp.data); 로그인 버튼을 눌렀는데에러가 발생하지도 않는데refreshToken이 출력안되고화면에 아무것도 출력이 안되네요print(resp.data); 부분이 출력이 안되는거같습니다 다른프로젝트로 넘어가면서 서버가 종료된거같은데 어떻게 해결해야할까요?
-
미해결처음하는 플러터(Flutter) 기초부터 실전까지 [풀스택 Part4] (쉽고 견고하게 단계별로 다양한 프로젝트까지)
몇가지 질문드립니다.
강의잘듣고있습니다. 잔재미 코딩님의 강의들은 대부분 파이썬 기반 웹개발이던데요;;; 커리큘럼 대부분이 파이썬 백엔드와 연관되어 한흐름을 이어나가시는걸 느낄수있었습니다. 갠적으로 궁금한 질문은 이겁니다. 질문1. 파이썬 자바 자바스크립트 각기 다른언어로 만약 웹사이트 백엔드서버를 구축한다면 스팩차이가있을까요? 제가 예전에 학원에 문의했더니 자바로 만든게 가장 서버 스팩이 빠르고 셋중에 가장 떨어지는게 파이썬이란 이야길 들은적이있거든요 그래서 학원측 권유로 자바 스프링 백엔드를국비가 아닌 사비로 6개월다녔었습니다. (국비수업 퀄리티가 많이떨어진다는 이야길 귀가따갑게들어서요) 질문2 제가 오프라인학원에서 자바 스프링 백엔드과정(6개월) 수료 한 상태에서 현재 웹사이트를 구축하고 그그걸연결시키는 앱을 만들려고 잔재미코딩님의 플러터강의를 구매해서 수강중입니다. 현재 스프링부트로 crud까진 할줄아는상태인데 잔재미 코딩님 단과강의들을보면 서버기술 강좌에도 파이썬 플라스크 배포방법 mysql에도 파이썬과연동하는법등 모든게 파이썬과 연동되는 내용이던데 이부분에있어서 자바쪽 공부해온 사람은 해당 강좌들을 들어도 무리가없을지요? 그렇다고 지금 파이썬을 첨부터 공부해서 커리큘럼을 따라가기엔 시간이 많이 걸릴것같아 좀두렵네요~ 자바스프링쪽으로 계속 파서 결과물을 만들고하는게 목표입니다. 혹시 자바나 자바스크립트계열로 시작한 수강생을위해 각단과강의들에 파이썬과 연동된 내용만있는게 아쉬웠는데 타언어 배포나 관련 내용을 만들어 업그레이드해주실순없는지요?? 질문3. 입문자 눈높이에 맞게 잘설명해주시던데 향후 자바스프링계열쪽 컨텐츠를 만들예정은없으신지요? 질문4. 현재 신청한 플러터 인강은 완강했지만 눈에만 발라놨지 아직 제것으로 체화가안된상태입니다.향후 플러터 앱개발의 중고급 개발기술에대한 강의 런칭예정이있을지요??? 전 단순 취업목적으로 it쪽을 공부하는게아닌 현재 나이가 40대 초반이라 직접 앱과 웹을 만들어 창업을해보려고하는 수강생입니다. ㅠㅠ
-
미해결Flutter 입문 - 안드로이드, iOS 개발을 한 번에 (with Firebase)
alt+enter 가 맥북에서는 option enter로 알고 있는데 단축키가 먹히지 않습니다 ㅜㅜ
editor에 있는 dart 체크박스에 체크 확인도 다 했습니다.
-
미해결Flutter 초입문 왕초보편
102강 에뮬레이터에 지도가 안 나옵니다
지도가 안 나와서 wipe data 를 했는데도 안 나옵니다. 어떻게 해야 할까요?
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
Riverpod CodeGeneration 깃허브 링크는 어디있나요?
안녕하세요.일반 riverpod는 찾았는데Code Generation기능이 추가된 깃허브는 어디있나요?
-
미해결Flutter 입문 - 안드로이드, iOS 개발을 한 번에 (with Firebase)
파이어베이스 연결시 갑자기 다른 오류가 발생했어요 ㅠㅠ
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.* What went wrong:A problem occurred evaluating project ':app'.> Failed to apply plugin 'com.android.internal.application'. > Could not create plugin of type 'AppPlugin'. > Could not generate a decorated class for type AppPlugin. > com/android/build/api/component/Component* 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. 도움이 필요합니다 ㅠㅠ
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
insert 시에 오류가 발생합니다.
안녕하세요. 강의를 듣고 변형해서 개발해 보고 있습니다. drifrt를 통한 insert 시에 오류가 발생합니다. [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: Bad state: GetIt: Object/factory with type LocalDataBase is not registered inside GetIt. 어떤 오류인지 검색을 해도 나오지가 않네요. 문제가 뭐인지 확인 좀 부탁드립니다. 감사합니다.
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
스크립트도 다운로드 할 수 있나요?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.코드팩토리 디스코드https://bit.ly/3HzRzUMFlutter 강의를 구매하시면 코드팩토리 디스코드 서버 플러터 프리미엄 채널에 들어오실 수 있습니다! 디스코드 서버에 들어오시고 저에게 메세지로 강의를 구매하신 이메일을 보내주시면 프리미엄 채널에 등록해드려요! 프리미엄 채널에 들어오시면 모든 질의응답 최우선으로 답변해드립니다!
-
해결됨Flutter 중급 3편 - 의존성 주입 가이드
객체가 아닌 일반 변수의 get it
안녕하세요.클린코드 3탄을 수강하고 너무 만족스러워서 이번 추석에 2탄을 추가로 수강했습니다. ㅎㅎ 2탄에서 뷰모델이 생성될 때 직접 데이터를 넣으시더군요.(객체가 아닌 일반 변수)평소에 뷰모델이 생성될 때 객체가 아닌 변수도 같이 바로 넣으려고 했으나 클래스(객체)가 아니기 때문에 매번 뷰를 생성하고 initstate 에서 lazy 하게 뷰모델에 데이터를 업데이트 했었습니다. 여기서 의문이 생겨서 질문 드립니다. 객체가 아닌 일반 변수에 대해서도 의존성 주입을 하는 것이 옳은 것인가요?만약 일반 변수에 대해서도 의존성 주입을 해야한다면(해도 된다면) getit 설정에서 어떻게 접근 하면 좋을 까요?늦은 시간에 죄송합니다. 답변 주시면 감사하겠습니다.!!
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
video 버튼 만들기에서 Stack 이 잘안됩니다.
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({required this.video, super.key}); @override State<CustomVideoPlayer> createState() => _CustomVideoPlayerState(); } class _CustomVideoPlayerState extends State<CustomVideoPlayer> { // 비디오 플레이어 같은 경우 컨트롤러를 사용해서 위젯을 구성해 줘야한다. VideoPlayerController? videoController; @override void initState() { super.initState(); initializeController(); } initializeController() async { videoController = VideoPlayerController.file( File(widget.video.path), // 이미지 피커에서 가져온 XFile 이랑 형식이 같지않아 dart:io 에 File에다가 변경해줘서 넣어준다. ); // 초기화하라 await videoController!.initialize(); setState(() {}); } @override Widget build(BuildContext context) { if (videoController == null) { return CircularProgressIndicator(); } return AspectRatio( // 비율 맞추는 위젯, 옵션 aspectRatio: videoController!.value.aspectRatio, child: Stack(children: [ VideoPlayer( videoController!, ), _Controler(), ]), ); } } class _Controler extends StatelessWidget { const _Controler({super.key}); @override Widget build(BuildContext context) { return Container( color: Colors.black.withOpacity(0.5), child: Row( crossAxisAlignment: CrossAxisAlignment.stretch, mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ renderIconButton( onPressed: () {}, iconData: Icons.rotate_left, ), renderIconButton( onPressed: () {}, iconData: Icons.play_arrow, ), renderIconButton( onPressed: () {}, iconData: Icons.rotate_right, ), ], ), ); } Widget renderIconButton({ required VoidCallback onPressed, required IconData iconData, }) { return IconButton( onPressed: onPressed, iconSize: 30.0, color: Colors.white, icon: Icon(iconData), ); } }해당 코드 로직입니다.!
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
플러터 [초보] 쳅터 14의 두번째강의 에서 7분20초대
안녕하세요, 코드팩토리님 질문있습니다!쳅터 14의 두번째강의 에서 7분20초대에 routetwo스크린에서 팝하면 routeone스크린으로 가야하는거 아닌가요? 왜 팝했는데 home스크린으로 가는건가요?답변 부탁드립니다!
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
문의드립니다
안녕하세요, 같은 프로젝트들을 여러번 반복해서 완전한 체득을 하고 있는데요, 반복하는데도 불구하고 프로그램 업그레이드 때문인지, 또는 알 수 없는 이유로 변화가 종종 생깁니다 ㅠ 이번엔 시작시간과 종료시간의 TextField에 null이라는 글자가 뜨는데요, 이전에는 이게 안떴던걸로 기억합니다.data가 들어있지 않은 맨 초기 화면에서도 null이라는 글자가 뜨지 않도록 하려면 어떻게 해야할까요?
-
미해결Flutter 초입문 왕초보편
에뮬레이터 실행오류
006. Android 에뮬레이터 작성 에서 실행시 위와 같은 오류가 뜹니다. 해결방법 문의합니다. 참고로 바이오스의 가상머신은 동작함을 확인했어요
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
Riverpod + Drift MVVM패턴 오류
안녕하세요 선생님!초급, 중급 강의 들으면서 riverpod 와 drift를 사용해서 MVVM패턴으로 간단한 코드를 작성 하였는데 에러가 발생하여 질문 드립니다._onTap으로 생성을 시도하면 point2번까지는 값이 잘 전달되는데 다음과 같은 오류가 발생합니다. ##### 오류 내용 #####[VERBOSE-2:dart_vm_initializer.cc(41)] Unhandled Exception: SqliteException(1299): while executing statement, NOT NULL constraint failed: counter_model.value, constraint failed (code 1299)Causing statement: INSERT INTO "counter_model" ("title") VALUES (?), parameters: TextName 답변 부탁 드리겠습니다.감사합니다!
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
StreamSubscription listen 내부에서 file copy 이슈
안녕하세요. 학습내용을 확장하는 중 이슈가 있어서 문의드립니다.윈도우 OS 타겟으로 개발 중이며,특정폴더(origin)에 파일이 생성되는 event 발생 시 다른 특정폴더(target)로 파일을 복사하는 로직을 구현했습니다.이슈는, 용량이 1kb로 작은 파일일 경우 잘 작동하지만, 용량이 몇mb 정도로 큰파일은 아래와 같은 예외가 발생하며 복사가 되지 않습니다.예외는 다음과 같습니다.Unhandled Exception: PathAccessException: Cannot copy file to 'C:\0.st\target\10.tdms', path = 'C:\0.st\origin\10.tdms' (OS Error: 다른 프로세스가 파일을 사용 중이기 때문에 프로세스가 액세스 할 수 없습니다. , errno = 32) #0 _checkForErrorResponse (dart:io/common.dart:55:9) #1 File.copy.<anonymous closure> (dart:io/fileimpl.dart:356:7) <asynchronous suspension> 제가 파일을 복사하기 위해 구현한 함수는 아래와 같습니다.중간에 newOriginFile.copy(copyFilePath); 부분에서 예외가 발생합니다.참고로 copySync 메서드로 변경해 보았으나 같은 현상이 발생합니다.복사할 대상 파일을 다른 프로세스에서 열지 않은 상태인데도 위와 같은 예외가 발생하여 디버깅이 안되는 상황입니다.항상 감사합니다!void _startEvaluationMode() { Navigator.pop(context, 'OK'); // 계측 모드 시작 setState(() { _evaluationMode = true; }); // origin 경로 불러오기 if (_directoryInfoBox.containsKey(DirectoryType.origin.name)) { setState(() { _originDirectory = Directory(_directoryInfoBox.get(DirectoryType.origin.name)!.path); }); if (!_originDirectory!.existsSync()) { // 실제 origin 경로의 폴더가 존재하지 않는 상태 // origin directory 확인하라는 alert dialog 보여주고 evaluation mode 종료 } // origin 경로 워칭 Stream<FileSystemEvent> originDirFileEvent = _originDirectory!.watch(); print('start evaluation mode'); // _streamListner = originDirFileEvent.listen((event) async { // if (event.type == 1) { // print('create event'); // } // }); _streamListner = originDirFileEvent.listen((event) { // origin 경로에 새 파일이 생성된 경우 FileSystemCreateEvent type == 1 if (event.type == 1) { print('created file: ${event.path}'); final newOriginFile = File(event.path); // 포맷에 맞는 파일 이름 생성 var newOriginFilename = p.basenameWithoutExtension(event.path); // print('base file name: ${newOriginFilename}'); String testMethodRoadName = TestMethodRoadInfoManager.getNameById(newOriginFilename); // 중복되는 이름 확인 // 파일 이름을 _ 로 분리하여 4번째 인덱스 값으로 구분 List<String> existingTestMethodRoadNameList = _evaluationItem!.evaluationFileInfos!.map((fileInfo) { return p .basenameWithoutExtension(fileInfo.evaluationFilePath) .split('_') .first; }).toList(); // print(existingTestMethodRoadNameList); // List<String> duplicatedList = existingTestMethodRoadNameList.where((name) { return name == testMethodRoadName; }).toList(); String fileNameWithDuplicateCount = ''; if (duplicatedList.isNotEmpty) { fileNameWithDuplicateCount = '${testMethodRoadName}_${duplicatedList.length + 1}'; } else { fileNameWithDuplicateCount = '${testMethodRoadName}_1'; } // print('road name: ${testMethodRoadName}'); // var copyFilePath = p.join(_itemDirectory!.path, // '${_itemFilePrefix}_${fileNameWithDuplicateCount}.tdms'); var copyFilePath = p.join( _itemDirectory!.path, '${fileNameWithDuplicateCount}.tdms'); print('copy file path: ${copyFilePath}'); // 파일을 eval item 경로로 이름 바꾸어 복사 newOriginFile.copy(copyFilePath); print('copy finish'); // eval item DB의 evaluationFileInfos 리스트 업데이트 var newEvaluationFileInfo = EvaluationFileInfo( originFilePath: event.path, evaluationFilePath: copyFilePath, activated: true, ); setState(() { _evaluationItem!.evaluationFileInfos!.add(newEvaluationFileInfo); }); // print( // 'file info length: ${_evaluationItem!.evaluationFileInfos!.length}'); _evaluationItemBox.put(_evaluationItem!.id, _evaluationItem!); // ui 상 file list, count 업데이트 List<File> files = []; for (var entity in _itemDirectory! .listSync(recursive: false, followLinks: false)) { if (entity is File) { files.add(entity); } } setState(() { _files = files; }); } }); } }