묻고 답해요
148만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
버퍼링
버퍼링이 너무 심해서 강의를 시청할수가없을정도에요
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
색상정보 DB에 넣기 질문
제대로 한것 같은데 에러가 뜨네요 ㅠㅠ에러 점검 부탁드립니다~~ lib/database/drift_database.dart:34:7: Error: The non-abstract class 'LocalDatabase' is missing implementations for these members: - GeneratedDatabase.schemaVersion - QueryExecutorUser.schemaVersionTry 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: ExceptionFAILURE: 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.orgBUILD FAILED in 7sException: Gradle task assembleDebug failed with exit code 1
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
우분투에서 안스 쓰고 싶어요
혹시 리눅스 환경에서의 안드로이드 스튜디오 세팅 영상을 만들어 주실 수 있으신가요?
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
안드로이드 BouncingScrollPhysics적용 질문
안드로이드 폰에서 BouncingSrollPhysics를 적용해서 iOS같은 효과를 내고 싶습니다. 그런데 bouncing을 적용해도 자식 위젯들이 화면을 넘어가지 않으면 바운싱 되지않으며 스크롤도 되지 않습니다.자식 위젯이 1개일 때, 안드로이드에서도 iOS같은 효과를 어떻게 낼 수 있나요??
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
U&I onPressed 질문
void onPressed() 함수를 만들어주었는데 왜 TopParts 내에서 파라미터는 onHeartPressed() 함수를 부르는게 아닌 onHeartPressed 로 선언을 해주어야 하나요?
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
video_player 강의 관련 질문드립니다
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가 아닌 웹으로 실행해서 그런것인가요?
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
에뮬레이터가 창뒤로 안가려지는 방법
화면에서와 같이 동영상 강의중에 보면 화면에 띄워놓은 에뮬레이터가 코드작성시에도 안드로이드 스튜디오 창 뒤로 안가려지고 그대로 유지되고 있는데 어떻게 하는거에요?저는 가려져서 안스창크기를 조절해서 에뮬레이터를 옆으로 놓고 있어서요...
-
해결됨[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
영상통화 강의에서 실기기 2개 사용 문의
안녕하세요.영상통화 강의를 끝마치고, 실제 기기 2개(안드로이드, 아이폰)에 같은 코드를 설치해서 실행하면서로 영상통화가 될 줄 알았는데, 각자 상대방 없음으로 뜨면서, 서로 같은 채널에 입장이 안 되었습니다.Agora SDK 설명서에는 채널이름만 같으면 될 것처럼 써 있었는데 제가 잘못 이해한 것인지...선생님 설명대로 서버에서 각 기기마다 토큰을 부여 받아야 하므로기기마다 같은 APP ID에 임시 토큰을 서로 달리 받아야 하는 것인지...실기기 2개로 영상통화 성공하는 것까지 마무리하고 싶습니다. 선생님께서 힌트를 살짝 주시면 감사하겠습니다.
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
throw 에러 했을때 에러 문구 표시.
현재 VScode에서 하고 있는데, 시뮬레이터 상에서 '카메라 또는 마이크 권한이 없습니다.' 가 뜨지않고, 시뮬레이터는 사진과같이 멈춰진상태에서, 사진과 같이 코드상에서 에러 문구가 뜹니다. 단순히 VScode와 Android Studio 의 차이인가요?감사합니다.
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
강의에서 작성한 소스코드 github url 은 어디있죠?
강의에서 작성한 소스코드 github url 은 어디있죠?
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
Icon Button 의 기능이 Hot restart 이후에도 사용되지 않습니다
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, ), ); } }
-
미해결Slack 클론 코딩[실시간 채팅 with React]
Cannot GET / 404 에러 발생하시는분
강의 7:40부근webpack.config.ts 파일72번째 라인devServer: { historyApiFallback: true, // react router port: 3090, devMiddleware: { publicPath: '/dist/' }, static: { directory: path.resolve(__dirname) }, }, 이부분 추가하시면 될것같습니다.static: { directory: path.resolve(__dirname) }
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
statelessWidget 생성시 super 부분
class _Test extends StatelessWidget { const _Test({super.key}); @override Widget build(BuildContext context) { return const Placeholder(); } }stateless를 탭으로 눌러서 자동 생성했을 때 super.key 부분이 이렇게 생성이 되는데 이건 축약표현인가요?이경우, final VoidCallback onPressed; const _Test({required this.onPressed, key});위 코드를 작성해도 되는 것인지 아니면 강의처럼 아래코드로 작성해야하는지 궁금합니다!final VoidCallback onPressed; const _Test({required this.onPressed, Key? key}) : super(key: key);
-
미해결Slack 클론 코딩[실시간 채팅 with React]
프로젝트에 사용할 상태와 로직 관리 라이브러리 훅 사용 질문입니다.
로그인 및 인증,인가(세션,jwt둘다 사용), 게시판(이미지포함), 댓글, 소켓채팅 정도의 기능을 구현하여 테스트 코드와 docker로 띄워서 CI/CD까지 구현하려고 합니다. 상태랑 로직 관리를 useReducer, React Context API, React Query, redux, graphql 정도로 생각하고 있는데 어떤걸로 하는게 좋을까요?!
-
미해결Slack 클론 코딩[실시간 채팅 with React]
npx sequelize db:create 실패
mac os에서 mysql을 homebrew로 사용중입니다.root계정의 비밀번호 설정 완료했습니다.back 환경설정에서 문제를 겪고있습니다.cd back으로 경로 이동후npm i로 node 모듈 설치 성공후에.env파일 구성(비밀번호 맞음),npx sequelize db:create 명령어 입력시 아래와 같은 에러가 발생합니다.-- 에러메세지 시작Sequelize CLI [Node: 16.18.0, CLI: 6.6.0, ORM: 6.28.0]Loaded configuration file "config/config.js".Using environment "development".ERROR: Failed to create schema directory 'sleact' (errno: 2 - No such file or directory)-- 에러메세지 종료-- .env파일 시작COOKIE_SECRET=sleactcookieMYSQL_PASSWORD=kaadal-- .env파일 종료--config.js 시작require('dotenv').config();module.exports = { "development": { "username": "root", "password": process.env.MYSQL_PASSWORD, "database": "sleact", "host": "127.0.0.1", "dialect": "mysql" }, "test": { "username": "root", "password": process.env.MYSQL_PASSWORD, "database": "sleact", "host": "127.0.0.1", "dialect": "mysql" }, "production": { "username": "root", "password": process.env.MYSQL_PASSWORD, "database": "sleact", "host": "127.0.0.1", "dialect": "mysql" }}-- config.js 종료이상입니다.
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 레딧 사이트 만들기(NextJS)(Pages Router)
DB 연결 시, password authentication failed for user 에러 해결 방법
version: "3.9" services: db: image: postgres:latest container_name: poster restart: always ports: - "5432:5432" environment: POSTGRES_USER: "${DB_USER_ID}" POSTGRES_PASSWORD: "${DB_USER_PW}" volumes: - commu:/var/lib/postgresql/data volumes: commu: {} 우선, docker compose down -v 명령어로 컨테이너를 삭제하고, data 폴더도 지워주세요.그리고 docker-compose.yml 파일에서 volumes를 저런 식으로 변경해주면 됩니다.변경 했으면 docker compose up 으로 컨테이너를 다시 생성해주면 정상적으로 연결됩니다.버전은 강의에서 나온대로 3으로 사용해도 상관 없습니다.
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
final 구문의 용법이 궁금합니다.
안녕하세요, 알찬 강의 잘 보고 있습니다. 이번 강의 중 질문 사항이 생겨 여쭤봅니다. final newBlackPink = blackPink.map((x){return '블랙핑크 $x';});이 구문에서, final 과 newBlackPink 사이에 변수 타입(이 경우는 Iterable)에 대한 선언이 있어야하는 것 아닌가? 생각했는데 안 써도 정의가 잘 되더라구요. final을 선언한 이상 변수의 값이 변경되지 않기 때문일까요? 그리고 이런 식으로 Iterable(Set, List 등도) 은 final 로 선언하는 것이 일반적인 용법인지 궁금합니다. 감사합니다.
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
Hive, Riverpop 제너레이터 호환성 문제
안녕하세요 선생님 지난번 날씨앱에서 질문 드리고 중급강의 GoRouter 까지 무지성으로 따라가고있는 수강생입니다.중급 캐시강의를 보다가 문득 든 생각이서버에서 받아온 데이터를 Hive를 사용해서 기기에 저장을 하고 휴대폰 DB에 저장된 리스트들을 Hive에 데이터가 있다면 hive에서 읽고 없다면 새로받아오는 형식으로 Riverpod을 사용해 관리하면 어떨까? 싶은 생각이 들었습니다. 이유는 서버에서 restAPI를 통해 받아온 값들은 메모리에 저장되어있으니 앱을 껏다 키거나 메모리가 초기화되면 캐쉬가 날아가는 것이 아닌가? 라는 생각이 들어서였구요(리스트나 자료들을 휴대폰 db에 저장 해놓고 꺼내쓴다면 재요청횟수가 줄어들어 비용절감이 되지 않을까? 싶은 생각) 그래서 당연히 생각만 가지고 있지 아직은 아무것도 할줄 모르지만 일단Hive와 Riverpod을 동시에 설치는 해보자는 생각에 인스톨 해봤는데요문제는 hive_generator의 버전은 analyzer 5.0과 호환되고 riverpop_generator와 json_serializable 제너레이터들은 analyzer 6.0과 호환되어 한프로젝트에 동시설치가 불가능 한 것 같습니다.analyzer6.0을 사용하는 다른 제너레이터들의 버전을 낮춰봐도 더 복잡하고 많은 에러가 뜨는데요. 1)그래서 캐쉬를 hive로 사용하는게 어떨까? 라는 생각이 맞는 생각인지? (예를들면 riverpod의 캐쉬를 사용하면 되는데 궂이 db를 캐쉬로 왜 사용하는가?)2)유용한 생각이라면 analyzer버전 호환문제를 해결해서 동시에 사용할 수 있는 방법이 있는지?3)동시 설치가 안된다면 hive외 대안이 있거나 sqflite 같은 다른sql이 대안이 되는지? (hive를 캐쉬 대용으로 사용하려고한것은 hive의 빠른속도 때문인데, sqflite를 사용하게되면 궂이 물리적인 db캐쉬가 유효/유용 한건지?) 에 대한 의문이 들었습니다.이런생각을 하는 이유는, 나중에 혼자 앱을 만들게 된다면 서버를 사용하는 것보다 파이어베이스 같은 클라우드 플랫폼을 사용하지 않을까 싶은 생각에서 트래픽을 줄일 수 있는 방법이 궁금해서 였습니다.아직 멋모르고 강의 열심히 따라가는 중이라 급한내용은 아니니 시간 편하실때 천천히 답변주시면 감사하겠습니다.
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
'circle' 부분에서 질문
안녕하세요._CustomGoogleMap에서 circle를 전달 받을때circles: Set.from([circle],)이런식으로 Set을 하셨는데, 따로 이렇게 하신 이유가 있을까요? {circle} 이렇게 하는게 더 낫지 않나 싶어서요. 감사합니다
-
미해결[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
섹션 21. 캘린더 스케쥴러 오류 문의드립니다.
색상 상태관리 부분을 듣고 있습니다. 똑 같이 따라했는데요. 아래 내용과 같이 FutureBuilder를 사용하여 똑같이 따라 했는데도 불구하고 null이 리턴되어 오류가 납니다. future: GetIt.I<LocalDatabase>().getCategoryColors() 에서 강사님 강의에서는 데이터를 가지고 오는데, 제가 만든 코드에서는 null이 리턴되네요. 혹시 몰라 main.dart에서 GetIt.I<LocalDatabase>().getCategoryColors() 를 실행해 보고, 결과를 보면 정상적인 데이터가 들어옵니다.뭐가 문제일까요?main.dartimport 'package:calendar_schedule_exam/database/drift_database.dart'; import 'package:calendar_schedule_exam/screen/home_screen.dart'; import 'package:drift/drift.dart'; import 'package:flutter/material.dart'; import 'package:get_it/get_it.dart'; import 'package:intl/date_symbol_data_local.dart'; const DEFAULT_COLORS = [ // 빨강 'F44336', // 주황 'FF9800', // 노랑 'FFEB3B', // 초록 'FCAF50', // 파랑 '2196F3', // 남 '3F51B5', // 보라 '9C27B0', ]; void main() async { WidgetsFlutterBinding.ensureInitialized(); await initializeDateFormatting(); final database = LocalDatabase(); GetIt.I.registerSingleton<LocalDatabase>(database); final result = GetIt.I<LocalDatabase>().getCategoryColors(); final colors = await database.getCategoryColors(); if (colors.isEmpty) { for (String hexCode in DEFAULT_COLORS) { await database.createCategoryColor( CategoryColorsCompanion( hexCode: Value(hexCode), ), ); } } runApp(MaterialApp( theme: ThemeData( fontFamily: 'NotoSans', ), home: HomeScreen(), )); } schedule_bottom_sheet.dartimport 'package:calendar_schedule_exam/component/custom_text_field.dart'; import 'package:calendar_schedule_exam/const/colors.dart'; import 'package:calendar_schedule_exam/database/drift_database.dart'; import 'package:calendar_schedule_exam/model/category_color.dart'; import 'package:flutter/material.dart'; import 'package:get_it/get_it.dart'; class ScheduleBottomSheet extends StatefulWidget { const ScheduleBottomSheet({super.key}); @override State<ScheduleBottomSheet> createState() => _ScheduleBottomSheetState(); } class _ScheduleBottomSheetState extends State<ScheduleBottomSheet> { final GlobalKey<FormState> formKey = GlobalKey(); int? startTime; int? endTime; String? content; int? selectedColorId; @override Widget build(BuildContext context) { final bottomInset = MediaQuery.of(context).viewInsets.bottom; return SafeArea( bottom: true, child: GestureDetector( onTap: () => FocusScope.of(context).requestFocus(FocusNode()), child: Container( height: MediaQuery.of(context).size.height / 2 + bottomInset, color: Colors.white, child: Padding( padding: EdgeInsets.only(bottom: bottomInset), child: Padding( padding: const EdgeInsets.only(left: 8.0, right: 8.0, top: 16.0), child: Form( key: formKey, autovalidateMode: AutovalidateMode.always, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ _Time( onStartSaved: (newValue) { startTime = int.parse(newValue!); }, onEndSaved: (newValue) { endTime = int.parse(newValue!); }, ), SizedBox(height: 16.0), _Content( onSaved: (newValue) { content = newValue; }, ), SizedBox(height: 16.0), FutureBuilder<List<CategoryColor>>( future: GetIt.I<LocalDatabase>().getCategoryColors(), builder: (context, snapshot) { print(snapshot.data); if (snapshot.hasData && selectedColorId == null && snapshot.data!.isNotEmpty) { selectedColorId = snapshot.data![0].id; } return _ColorPicker( colors: snapshot.hasData ? snapshot.data! : [], selectColorId: selectedColorId!, ); }), SizedBox(height: 16.0), _SaveButton( onPressed: onSavePressed, ), ], ), ), ), ), ), ), ); } void onSavePressed() { if (formKey.currentState == null) { return; } if (formKey.currentState!.validate()) { formKey.currentState!.save(); } else { print('에러가 있습니다.'); } } } class _Time extends StatelessWidget { final FormFieldSetter<String> onStartSaved; final FormFieldSetter<String> onEndSaved; const _Time( {super.key, required this.onStartSaved, required this.onEndSaved}); @override Widget build(BuildContext context) { return Row( children: [ Expanded( child: CustomTextField( label: '시작 시간', isTime: true, onSaved: onStartSaved, )), SizedBox(width: 16.0), Expanded( child: CustomTextField( label: '마감 시간', isTime: true, onSaved: onEndSaved, ), ), ], ); } } class _Content extends StatelessWidget { final FormFieldSetter<String> onSaved; const _Content({super.key, required this.onSaved}); @override Widget build(BuildContext context) { return Expanded( child: CustomTextField( label: '내용', isTime: false, onSaved: onSaved, ), ); } } class _ColorPicker extends StatelessWidget { final List<CategoryColor> colors; final int selectColorId; const _ColorPicker( {super.key, required this.colors, required this.selectColorId}); @override Widget build(BuildContext context) { return Wrap( spacing: 8.0, runSpacing: 10.0, children: colors.map((e) => rendColor(e, selectColorId == e.id)).toList(), ); } Widget rendColor(CategoryColor color, bool isSelected) { return Container( decoration: BoxDecoration( shape: BoxShape.circle, color: Color(int.parse('FF${color.hexCode}', radix: 16)), border: isSelected ? Border.all(color: Colors.black, width: 1.0) : null, ), height: 32, width: 32); } } class _SaveButton extends StatelessWidget { final VoidCallback onPressed; const _SaveButton({super.key, required this.onPressed}); @override Widget build(BuildContext context) { return SizedBox( width: double.infinity, child: ElevatedButton( style: ElevatedButton.styleFrom( backgroundColor: PRIMARY_COLOR, ), onPressed: onPressed, child: Text('Save'), ), ); } } drift_database.dartimport 'dart:io'; import 'package:calendar_schedule_exam/model/category_color.dart'; import 'package:calendar_schedule_exam/model/schedule.dart'; import 'package:drift/drift.dart'; import 'package:drift/native.dart'; import 'package:path/path.dart' as p; import 'package:path_provider/path_provider.dart'; part 'drift_database.g.dart'; @DriftDatabase( tables: [ Schedules, CategoryColors, ], ) class LocalDatabase extends _$LocalDatabase { LocalDatabase() : super(_openConnection()); // insert schedules Future<int> createSchedule(SchedulesCompanion data) => into(schedules).insert(data); // insert categoryColors Future<int> createCategoryColor(CategoryColorsCompanion data) => into(categoryColors).insert(data); // select all categoryColors Future<List<CategoryColor>> getCategoryColors() => select(categoryColors).get(); @override // TODO: implement schemaVersion int get schemaVersion => 1; } LazyDatabase _openConnection() { return LazyDatabase(() async { final dbFolder = await getApplicationDocumentsDirectory(); final file = File(p.join(dbFolder.path, 'db.sqlite')); return NativeDatabase(file); }); }오류내용Launching lib/main.dart on iPhone 14 Pro Max in debug mode... Running Xcode build... Xcode build done. 7.8s [VERBOSE-2:FlutterDarwinContextMetalImpeller.mm(35)] Using the Impeller rendering backend. Debug service listening on ws://127.0.0.1:61505/HeTRp4ZQphA=/ws Syncing files to device iPhone 14 Pro Max... flutter: null ======== Exception caught by widgets library ======================================================= The following _TypeError was thrown building FutureBuilder<List<CategoryColor>>(dirty, state: _FutureBuilderState<List<CategoryColor>>#41541): Null check operator used on a null value The relevant error-causing widget was: FutureBuilder<List<CategoryColor>> FutureBuilder:file:///Users/choiwooin/dev/flutterProject/calendar_schedule_exam/lib/component/schedule_bottom_sheet.dart:57:21 When the exception was thrown, this was the stack: #0 _ScheduleBottomSheetState.build.<anonymous closure> (package:calendar_schedule_exam/component/schedule_bottom_sheet.dart:68:59) #1 _FutureBuilderState.build (package:flutter/src/widgets/async.dart:612:55) #2 StatefulElement.build (package:flutter/src/widgets/framework.dart:5198:27) #3 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5086:15) #4 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11) #5 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #6 ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:5068:5) #7 StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:5242:11)