feat: add web support for drift database

This commit is contained in:
2025-05-04 12:54:16 +03:00
parent e1221210b7
commit 224e300419
2 changed files with 126 additions and 26 deletions
+117 -18
View File
@@ -1,15 +1,13 @@
import 'dart:io';
// ignore_for_file: unused_import // Часто генерируется при условном импорте
import 'package:drift/drift.dart';
import 'package:drift/native.dart';
// import 'package:flutter/material.dart'; // Не требуется напрямую, т.к. Category импортируется
import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart' as p;
// import 'package:rxdart/rxdart.dart'; // Не используется
// Условный импорт бэкенда базы данных
import 'database_connection/connection.dart'
if (dart.library.html) 'database_connection/connection_web.dart'
if (dart.library.io) 'database_connection/connection_native.dart';
// Импортируем модель категории для возвращаемого типа и утилиты
import '../models/category.dart';
// Удален ненужный импорт: import '../models/transaction_record.dart';
import '../utils/category_utils.dart'; // Helper for category details
// Эта строка указывает Drift сгенерировать файл database.g.dart
@@ -30,7 +28,8 @@ class Transactions extends Table {
// Аннотация @DriftDatabase указывает Drift сгенерировать код для этой базы данных
@DriftDatabase(tables: [Transactions])
class AppDatabase extends _$AppDatabase {
AppDatabase() : super(_openConnection());
// Используем функцию connect() из условного импорта для создания соединения
AppDatabase() : super(connect());
// Версия схемы. Увеличивайте при изменении структуры таблиц.
@override
@@ -129,17 +128,117 @@ class AppDatabase extends _$AppDatabase {
}
}
// Функция для открытия соединения с базой данных
LazyDatabase _openConnection() {
// Вычисление пути к файлу базы данных в папке документов приложения
return LazyDatabase(() async {
final dbFolder = await getApplicationDocumentsDirectory();
// Создаем файл 'db.sqlite' в этой папке
final file = File(p.join(dbFolder.path, 'db.sqlite'));
print("Database file path: ${file.path}"); // Логируем путь для отладки
// --- Старый способ с _openConnection ---
/*
import 'dart:io'; // Нужен только для NativeDatabase
// Используем NativeDatabase для открытия соединения
// logStatements: true полезен для отладки SQL-запросов
import 'package:drift/drift.dart';
import 'package:drift/native.dart'; // Для NativeDatabase
import 'package:drift/web.dart'; // Для WebDatabase
import 'package:flutter/foundation.dart'; // Для kIsWeb
import 'package:path_provider/path_provider.dart'; // Для NativeDatabase
import 'package:path/path.dart' as p; // Для NativeDatabase
// ... (остальной код database.dart как выше) ...
// Функция для открытия соединения с базой данных (старый вариант)
QueryExecutor _openConnection() {
// Вычисление пути к файлу базы данных в папке документов приложения
if (kIsWeb) {
print("Using WebDatabase (IndexedDB)");
// Используем WebDatabase для веба. 'db' - имя базы данных в IndexedDB.
// logStatements: true полезен для отладки SQL-запросов (в консоли браузера)
return WebDatabase('db', logStatements: false);
} else {
// Используем NativeDatabase для нативных платформ (Android, iOS, Desktop)
return LazyDatabase(() async {
final dbFolder = await getApplicationDocumentsDirectory();
// Создаем файл 'db.sqlite' в этой папке
final file = File(p.join(dbFolder.path, 'db.sqlite'));
print("Database file path (Native): ${file.path}"); // Логируем путь для отладки
// Используем NativeDatabase для открытия соединения
// logStatements: true полезен для отладки SQL-запросов
return NativeDatabase(file, logStatements: false);
});
}
}
*/
// --- Новый способ с условным импортом ---
// Создайте 3 новых файла в папке lib/database/database_connection/
// Файл 1: lib/database/database_connection/connection.dart
// Этот файл будет пустым или содержать общие абстракции, если нужно.
// Он нужен для указания базового пути для условного импорта.
/*
// lib/database/database_connection/connection.dart
import 'package:drift/drift.dart';
// Можно оставить пустым или определить общие типы/функции,
// но для простого соединения достаточно пустого файла.
// Главное, чтобы он существовал для разрешения импорта.
// Определим функцию-заглушку, чтобы основной файл мог ее импортировать
QueryExecutor connect() => throw UnimplementedError('Platform not supported');
*/
// Файл 2: lib/database/database_connection/connection_web.dart
/*
// lib/database/database_connection/connection_web.dart
import 'package:drift/drift.dart';
import 'package:drift/web.dart';
QueryExecutor connect() {
print("Using WebDatabase (IndexedDB)");
// logStatements: true полезен для отладки SQL-запросов (в консоли браузера)
return WebDatabase('db', logStatements: false);
}
*/
// Файл 3: lib/database/database_connection/connection_native.dart
/*
// lib/database/database_connection/connection_native.dart
import 'dart:io';
import 'package:drift/drift.dart';
import 'package:drift/native.dart';
import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart' as p;
import 'package:sqlite3_flutter_libs/sqlite3_flutter_libs.dart'; // Импорт для настройки sqlite3
import 'package:sqlite3/sqlite3.dart'; // Импорт для настройки sqlite3
QueryExecutor connect() {
// Используем LazyDatabase для отложенной инициализации на нативных платформах
return LazyDatabase(() async {
// Настройка пути к библиотеке sqlite3 для Windows/Linux
// На Android/iOS/macOS это обычно не требуется, так как используется sqlite3_flutter_libs
if (Platform.isWindows || Platform.isLinux) {
// Эта часть может потребовать адаптации в зависимости от вашей системы сборки
// и того, как вы распространяете нативные библиотеки.
// Пример: final libraryNextToScript = File('sqlite3.so'); // или .dll
// applyWorkaroundToOpenSqlite3Library(library: libraryNextToScript);
// Или используйте пакет sqlite3_flutter_libs, который пытается сделать это автоматически
}
// Настройка для FFI (может быть не нужна с последними версиями drift/sqlite3_flutter_libs)
// sqlite3.open.overrideFor(OperatingSystem.windows, openSqliteOnWindows); // Пример для Windows
final dbFolder = await getApplicationDocumentsDirectory();
final file = File(p.join(dbFolder.path, 'db.sqlite'));
print("Database file path (Native): ${file.path}");
// Применяем обходной путь для открытия библиотеки sqlite3, если нужно
// Это важно для некоторых платформ, особенно Windows/Linux
// await applyWorkaroundToOpenSqlite3Library(checkIsolate: false); // Используйте по необходимости
// Используем NativeDatabase
return NativeDatabase(file, logStatements: false);
});
}
// Пример функции для Windows (может потребоваться адаптация)
// DynamicLibrary openSqliteOnWindows() {
// final scriptDir = File(Platform.script.toFilePath()).parent;
// final libraryNextToScript = File(p.join(scriptDir.path, 'sqlite3.dll'));
// return DynamicLibrary.open(libraryNextToScript.path);
// }
*/
+9 -8
View File
@@ -19,7 +19,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
version: 1.0.0+1
environment:
sdk: ^3.7.0
sdk: ^3.7.0 # Drift 2.18 requires Dart 3.4+, Drift 2.16 requires Dart 3.3+
# Dependencies specify other packages that your package needs in order to work.
# To automatically upgrade your package dependencies to the latest versions
@@ -32,11 +32,12 @@ dependencies:
sdk: flutter
fl_chart: ^0.71.0
intl: ^0.19.0 # For date formatting
drift: ^2.26.0 # Added Drift
sqlite3_flutter_libs: ^0.5.22 # Recommended for Drift on Flutter
path_provider: ^2.1.3 # To find database file location
path: ^1.9.0 # To construct database file path
rxdart: ^0.28.0 # Added rxdart for combining streams in database
drift: ^2.18.0 # Updated Drift
drift_web: ^0.1.0 # Added Drift Web support
sqlite3_flutter_libs: ^0.5.24 # Needed for native platforms
path_provider: ^2.1.3 # To find database file location on native
path: ^1.9.0 # To construct database file path on native
# rxdart: ^0.28.0 # Removed as it wasn't used in database.dart
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^1.0.8
@@ -44,8 +45,8 @@ dependencies:
dev_dependencies:
flutter_test:
sdk: flutter
drift_dev: ^2.18.0 # Added Drift code generator
build_runner: ^2.4.11 # Added build_runner
drift_dev: ^2.18.0 # Updated Drift code generator
build_runner: ^2.4.11 # Updated build_runner
# The "flutter_lints" package below contains a set of recommended lints to
# encourage good coding practices. The lint set provided by the package is