Flutter 윈도우에서 sqflite 사용 시 databaseFactory not initialized 오류 해결

Flutter(플러터) 개발 중에 sqflite를 적용하고, 타겟 디바이스를 윈도우로 선택하여 실행하니
“Unhandled Exception: Bad state: databaseFactory not initialized” 메시지와 함께 오류가 발생
했다.
이 경우, 원인과 함께 해결 방안을 공유해 본다.

Flutter 윈도우에서 sqflite 사용시 "Unhandled Exception: Bad state: databaseFactory not initialized" 오류가 발생한 모습
 Flutter 윈도우에서 sqflite 사용시 “Unhandled Exception: Bad state: databaseFactory not initialized” 오류가 발생한 모습

원인

sqflite는 Flutter에서 가장 널리 사용되는 SQLite 플러그인으로, 주로 모바일 환경(Android, iOS)에서 SQLite 데이터베이스와 쉽게 연동할 수 있도록 도와준다.
sqflite는 모바일 환경에서 내장된 SQLite 라이브러리를 활용한다.

그러나 데스크톱에서는 모바일 OS처럼 SQLite가 기본 내장되어 있지 않거나, Flutter 앱이 접근할 수 없어 다음과 같은 메세지와 함께 오류가 발생한다.

Debug service listening on ws://127.0.0.1:4808/k4trF4atSfE=/ws
Syncing files to device Windows...
[ERROR:flutter/runtime/dart_vm_initializer.cc(40)] Unhandled Exception: Bad state: databaseFactory not initialized
databaseFactory is only initialized when using sqflite. When using `sqflite_common_ffi`
You must call `databaseFactory = databaseFactoryFfi;` before using global openDatabase API

#0      databaseFactory.<anonymous closure> (package:sqflite_common/src/sqflite_database_factory.dart:32:7)
#1      databaseFactory (package:sqflite_common/src/sqflite_database_factory.dart:36:6)
#2      getDatabasesPath (package:sqflite_common/sqflite.dart:109:38)

해결

플러터 앱이 실행될 때, 플랫폼이 윈도우일 경우 sqflite_ffi를 초기화해 주면 해결된다.

먼저 아래 명령어로 sqflite_common_ffi 패키지를 추가한다.
pubspec.yaml의 dependencies 항목에도 sqflite_common_ffi: ^2.3.6 (또는 그 이후 버전)이 추가된다.

dart pub add sqflite_common_ffi

main.dart에서 sqflite_ffi와 Platform을 임포트하고, sqflite_ffi 초기화 코드를 삽입한다.
데이터베이스 액세스는 초기화 코드 이후에 사용하도록 한다.

import 'package:sqflite_common_ffi/sqflite_ffi.dart';
import 'dart:io' show Platform;

void main() {
  // sqflite_ffi 초기화
  if (Platform.isWindows) { // 플랫폼이 Windows일 경우
    sqfliteFfiInit(); // SQLite C 라이브러리 초기화
    databaseFactory = databaseFactoryFfi; // FFI 기반 팩토리 사용 설정
  }
}

댓글 남기기