From 10ad73c9408c8b8df0b3f7dc9d09c69ee336c2b7 Mon Sep 17 00:00:00 2001 From: Marco Date: Fri, 29 Mar 2024 13:52:28 +0100 Subject: [PATCH] Adding persistence This commit adds persistence. Notes are added to a sqlite database, can be deleted and are read at app start. --- lib/database.dart | 58 +++ lib/database.g.dart | 197 +++++++++ lib/main.dart | 5 +- lib/note.dart | 12 + lib/{notes.dart => notes_app.dart} | 86 ++-- lib/persistence_bloc.dart | 62 ++- linux/flutter/generated_plugin_registrant.cc | 4 + linux/flutter/generated_plugins.cmake | 1 + macos/Flutter/GeneratedPluginRegistrant.swift | 4 + pubspec.lock | 406 +++++++++++++++++- pubspec.yaml | 7 + .../flutter/generated_plugin_registrant.cc | 3 + windows/flutter/generated_plugins.cmake | 1 + 13 files changed, 792 insertions(+), 54 deletions(-) create mode 100644 lib/database.dart create mode 100644 lib/database.g.dart create mode 100644 lib/note.dart rename lib/{notes.dart => notes_app.dart} (54%) diff --git a/lib/database.dart b/lib/database.dart new file mode 100644 index 0000000..a48c48a --- /dev/null +++ b/lib/database.dart @@ -0,0 +1,58 @@ +import 'package:drift/drift.dart'; +import 'dart:io'; +import 'package:drift/native.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:path/path.dart' as p; +import 'package:sqlite3/sqlite3.dart'; +import 'package:sqlite3_flutter_libs/sqlite3_flutter_libs.dart'; + +part 'database.g.dart'; + +class NoteTable extends Table { + TextColumn get id => text()(); + TextColumn get content => text()(); +} + +@DriftDatabase(tables: [NoteTable]) +class AppDatabase extends _$AppDatabase { + AppDatabase() : super(_openConnection()); + + @override + int get schemaVersion => 1; + + @override + MigrationStrategy get migration { + return MigrationStrategy( + onCreate: (Migrator m) async { + await m.createAll(); + }, + onUpgrade: (Migrator m, int from, int to) async { + if (from < 2) {} + }, + ); + } +} + +LazyDatabase _openConnection() { + // the LazyDatabase util lets us find the right location for the file async. + return LazyDatabase(() async { + // put the database file, called db.sqlite here, into the documents folder + // for your app. + final dbFolder = await getApplicationDocumentsDirectory(); + final file = File(p.join(dbFolder.path, 'db.sqlite')); + + // Also work around limitations on old Android versions + if (Platform.isAndroid) { + await applyWorkaroundToOpenSqlite3OnOldAndroidVersions(); + } + + // Make sqlite3 pick a more suitable location for temporary files - the + // one from the system may be inaccessible due to sandboxing. + final cachebase = (await getTemporaryDirectory()).path; + // We can't access /tmp on Android, which sqlite3 would try by default. + // Explicitly tell it about the correct temporary directory. + sqlite3.tempDirectory = cachebase; + + return NativeDatabase.createInBackground(file); + }); +} diff --git a/lib/database.g.dart b/lib/database.g.dart new file mode 100644 index 0000000..eb1e489 --- /dev/null +++ b/lib/database.g.dart @@ -0,0 +1,197 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'database.dart'; + +// ignore_for_file: type=lint +class $NoteTableTable extends NoteTable + with TableInfo<$NoteTableTable, NoteTableData> { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + $NoteTableTable(this.attachedDatabase, [this._alias]); + static const VerificationMeta _idMeta = const VerificationMeta('id'); + @override + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + static const VerificationMeta _contentMeta = + const VerificationMeta('content'); + @override + late final GeneratedColumn content = GeneratedColumn( + 'content', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + @override + List get $columns => [id, content]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'note_table'; + @override + VerificationContext validateIntegrity(Insertable instance, + {bool isInserting = false}) { + final context = VerificationContext(); + final data = instance.toColumns(true); + if (data.containsKey('id')) { + context.handle(_idMeta, id.isAcceptableOrUnknown(data['id']!, _idMeta)); + } else if (isInserting) { + context.missing(_idMeta); + } + if (data.containsKey('content')) { + context.handle(_contentMeta, + content.isAcceptableOrUnknown(data['content']!, _contentMeta)); + } else if (isInserting) { + context.missing(_contentMeta); + } + return context; + } + + @override + Set get $primaryKey => const {}; + @override + NoteTableData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return NoteTableData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}id'])!, + content: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}content'])!, + ); + } + + @override + $NoteTableTable createAlias(String alias) { + return $NoteTableTable(attachedDatabase, alias); + } +} + +class NoteTableData extends DataClass implements Insertable { + final String id; + final String content; + const NoteTableData({required this.id, required this.content}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['content'] = Variable(content); + return map; + } + + NoteTableCompanion toCompanion(bool nullToAbsent) { + return NoteTableCompanion( + id: Value(id), + content: Value(content), + ); + } + + factory NoteTableData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return NoteTableData( + id: serializer.fromJson(json['id']), + content: serializer.fromJson(json['content']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'content': serializer.toJson(content), + }; + } + + NoteTableData copyWith({String? id, String? content}) => NoteTableData( + id: id ?? this.id, + content: content ?? this.content, + ); + @override + String toString() { + return (StringBuffer('NoteTableData(') + ..write('id: $id, ') + ..write('content: $content') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, content); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is NoteTableData && + other.id == this.id && + other.content == this.content); +} + +class NoteTableCompanion extends UpdateCompanion { + final Value id; + final Value content; + final Value rowid; + const NoteTableCompanion({ + this.id = const Value.absent(), + this.content = const Value.absent(), + this.rowid = const Value.absent(), + }); + NoteTableCompanion.insert({ + required String id, + required String content, + this.rowid = const Value.absent(), + }) : id = Value(id), + content = Value(content); + static Insertable custom({ + Expression? id, + Expression? content, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (content != null) 'content': content, + if (rowid != null) 'rowid': rowid, + }); + } + + NoteTableCompanion copyWith( + {Value? id, Value? content, Value? rowid}) { + return NoteTableCompanion( + id: id ?? this.id, + content: content ?? this.content, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (content.present) { + map['content'] = Variable(content.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('NoteTableCompanion(') + ..write('id: $id, ') + ..write('content: $content, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +abstract class _$AppDatabase extends GeneratedDatabase { + _$AppDatabase(QueryExecutor e) : super(e); + late final $NoteTableTable noteTable = $NoteTableTable(this); + @override + Iterable> get allTables => + allSchemaEntities.whereType>(); + @override + List get allSchemaEntities => [noteTable]; +} diff --git a/lib/main.dart b/lib/main.dart index 95ad6f6..c862b68 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,10 +1,11 @@ import 'package:flutter/material.dart'; -import 'package:fnotes/notes.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:fnotes/notes_app.dart'; import 'package:fnotes/persistence_bloc.dart'; import 'package:fnotes/theme_bloc.dart'; void main() { + WidgetsFlutterBinding.ensureInitialized(); //for drift runApp(const MainApp()); } @@ -22,7 +23,7 @@ class MainApp extends StatelessWidget { builder: (context, state) { return MaterialApp( theme: state.theme, - home: const Notes(), + home: const NotesApp(), ); }, ), diff --git a/lib/note.dart b/lib/note.dart new file mode 100644 index 0000000..8dad36c --- /dev/null +++ b/lib/note.dart @@ -0,0 +1,12 @@ +import 'package:uuid/uuid.dart'; + +class Note { + final String content; + late String id; + + Note({required this.content}) { + id = const Uuid().v4().toString(); + } + + Note.withId({required this.id, required this.content}); +} diff --git a/lib/notes.dart b/lib/notes_app.dart similarity index 54% rename from lib/notes.dart rename to lib/notes_app.dart index d1ef58d..b12b3c4 100644 --- a/lib/notes.dart +++ b/lib/notes_app.dart @@ -1,22 +1,26 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:fnotes/note.dart'; +import 'package:fnotes/persistence_bloc.dart'; import 'package:fnotes/theme_bloc.dart'; -import 'package:uuid/uuid.dart'; -class Notes extends StatefulWidget { - const Notes({ +class NotesApp extends StatefulWidget { + const NotesApp({ super.key, }); @override - State createState() => _NotesState(); + State createState() => _NotesAppState(); } -class _NotesState extends State { - List notes = List.empty(growable: true); +class _NotesAppState extends State { final phraseController = TextEditingController(); - Map notesMap = {}; + @override + void initState() { + context.read().add(LoadNotesEvent()); + super.initState(); + } @override Widget build(BuildContext context) { @@ -34,37 +38,42 @@ class _NotesState extends State { ), body: BlocBuilder( builder: (context, state) { - return ListView.builder( - itemCount: notes.length, - itemBuilder: (context, index) { - return Dismissible( - onDismissed: (direction) { - notes.removeAt(index); - setState(() {}); - }, - key: ValueKey(notes[index]), - child: Card( - elevation: 5, - color: state.theme.colorScheme.primaryContainer, - child: SizedBox( - height: 50, - child: Padding( - padding: const EdgeInsets.only(left: 20), - child: Align( - alignment: Alignment.centerLeft, - child: Text( - notes[index], - style: TextStyle( - color: - state.theme.colorScheme.onPrimaryContainer), + return BlocBuilder( + builder: (context, blocState) { + return ListView.builder( + itemCount: blocState.notes.length, + itemBuilder: (context, index) { + return Dismissible( + onDismissed: (direction) { + context.read().add(NoteDismissed( + Note.withId( + id: blocState.notes[index].id, + content: blocState.notes[index].content))); + }, + key: ValueKey(blocState.notes[index]), + child: Card( + elevation: 5, + color: state.theme.colorScheme.primaryContainer, + child: SizedBox( + height: 50, + child: Padding( + padding: const EdgeInsets.only(left: 20), + child: Align( + alignment: Alignment.centerLeft, + child: Text( + blocState.notes[index].content, + style: TextStyle( + color: + state.theme.colorScheme.onPrimaryContainer), + ), ), ), ), ), - ), - ); - }, - ); + ); + }, + ); + }); }, ), floatingActionButton: FloatingActionButton( @@ -73,8 +82,9 @@ class _NotesState extends State { newNote.then( (value) { if (value != null && value.isNotEmpty) { - addNote(value); - setState(() {}); + context + .read() + .add(NoteEntered(Note(content: value))); } }, ); @@ -118,8 +128,4 @@ class _NotesState extends State { }, ); } - - void addNote(String text) { - notes.add(text); - } } diff --git a/lib/persistence_bloc.dart b/lib/persistence_bloc.dart index 539536c..3171843 100644 --- a/lib/persistence_bloc.dart +++ b/lib/persistence_bloc.dart @@ -1,13 +1,55 @@ import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:fnotes/database.dart'; +import 'package:fnotes/note.dart'; class PersistenceBloc extends Bloc { + static final database = AppDatabase(); + PersistenceBloc() : super(PersistenceState.init()) { on(storeAllNotes); on(loadAllNotes); + on(storeNote); + on(deleteNote); } void storeAllNotes(PersistenceEvent event, Emitter emit) {} - void loadAllNotes(PersistenceEvent event, Emitter emit) {} + + void loadAllNotes( + PersistenceEvent event, Emitter emit) async { + List list = []; + + await database.select(database.noteTable).get().then( + (value) { + list = value.map((row) { + return Note.withId(id: row.id, content: row.content); + }).toList(); + }, + ); + + emit(PersistenceState(notes: list)); + } + + void storeNote(NoteEntered event, Emitter emit) async { + await database.into(database.noteTable).insert(NoteTableCompanion.insert( + id: event.note.id, + content: event.note.content, + )); + + var newNotes = state.notes; + newNotes.add(Note.withId(id: event.note.id, content: event.note.content)); + emit(PersistenceState(notes: newNotes)); + } + + void deleteNote(NoteDismissed event, Emitter emit) { + (database.delete(database.noteTable) + ..where((tbl) => tbl.id.equals(event.note.id))) + .go(); + + var newNotes = + state.notes.where((note) => note.id != event.note.id).toList(); + + emit(PersistenceState(notes: newNotes)); + } } class PersistenceEvent {} @@ -16,12 +58,22 @@ class LoadNotesEvent extends PersistenceEvent {} class StoreNotesEvent extends PersistenceEvent {} -class PersistenceState { - int lastIndex; +class NoteEntered extends PersistenceEvent { + final Note note; + NoteEntered(this.note); +} - PersistenceState({required this.lastIndex}); +class NoteDismissed extends PersistenceEvent { + final Note note; + NoteDismissed(this.note); +} + +class PersistenceState { + List notes = List.empty(growable: true); + + PersistenceState({required this.notes}); factory PersistenceState.init() { - return PersistenceState(lastIndex: 0); + return PersistenceState(notes: []); } } diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index e71a16d..2c1ec4f 100644 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -6,6 +6,10 @@ #include "generated_plugin_registrant.h" +#include void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) sqlite3_flutter_libs_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "Sqlite3FlutterLibsPlugin"); + sqlite3_flutter_libs_plugin_register_with_registrar(sqlite3_flutter_libs_registrar); } diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index 2e1de87..7ea2a80 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -3,6 +3,7 @@ # list(APPEND FLUTTER_PLUGIN_LIST + sqlite3_flutter_libs ) list(APPEND FLUTTER_FFI_PLUGIN_LIST diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 724bb2a..140712b 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,8 +5,12 @@ import FlutterMacOS import Foundation +import path_provider_foundation import shared_preferences_foundation +import sqlite3_flutter_libs func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) + Sqlite3FlutterLibsPlugin.register(with: registry.registrar(forPlugin: "Sqlite3FlutterLibsPlugin")) } diff --git a/pubspec.lock b/pubspec.lock index 674023d..b1172ae 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,6 +1,38 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + sha256: "0b2f2bd91ba804e53a61d757b986f89f1f9eaed5b11e4b2f5a2468d86d6c9fc7" + url: "https://pub.dev" + source: hosted + version: "67.0.0" + analyzer: + dependency: transitive + description: + name: analyzer + sha256: "37577842a27e4338429a1cbc32679d508836510b056f1eedf0c8d20e39c1383d" + url: "https://pub.dev" + source: hosted + version: "6.4.1" + analyzer_plugin: + dependency: transitive + description: + name: analyzer_plugin + sha256: "9661b30b13a685efaee9f02e5d01ed9f2b423bd889d28a304d02d704aee69161" + url: "https://pub.dev" + source: hosted + version: "0.11.3" + args: + dependency: transitive + description: + name: args + sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596 + url: "https://pub.dev" + source: hosted + version: "2.4.2" async: dependency: transitive description: @@ -13,10 +45,10 @@ packages: dependency: transitive description: name: bloc - sha256: f53a110e3b48dcd78136c10daa5d51512443cea5e1348c9d80a320095fa2db9e + sha256: "106842ad6569f0b60297619e9e0b1885c2fb9bf84812935490e6c5275777804e" url: "https://pub.dev" source: hosted - version: "8.1.3" + version: "8.1.4" boolean_selector: dependency: transitive description: @@ -25,6 +57,70 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.1" + build: + dependency: transitive + description: + name: build + sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + build_config: + dependency: transitive + description: + name: build_config + sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1 + url: "https://pub.dev" + source: hosted + version: "1.1.1" + build_daemon: + dependency: transitive + description: + name: build_daemon + sha256: "0343061a33da9c5810b2d6cee51945127d8f4c060b7fbdd9d54917f0a3feaaa1" + url: "https://pub.dev" + source: hosted + version: "4.0.1" + build_resolvers: + dependency: transitive + description: + name: build_resolvers + sha256: "339086358431fa15d7eca8b6a36e5d783728cf025e559b834f4609a1fcfb7b0a" + url: "https://pub.dev" + source: hosted + version: "2.4.2" + build_runner: + dependency: "direct dev" + description: + name: build_runner + sha256: "3ac61a79bfb6f6cc11f693591063a7f19a7af628dc52f141743edac5c16e8c22" + url: "https://pub.dev" + source: hosted + version: "2.4.9" + build_runner_core: + dependency: transitive + description: + name: build_runner_core + sha256: "4ae8ffe5ac758da294ecf1802f2aff01558d8b1b00616aa7538ea9a8a5d50799" + url: "https://pub.dev" + source: hosted + version: "7.3.0" + built_collection: + dependency: transitive + description: + name: built_collection + sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" + url: "https://pub.dev" + source: hosted + version: "5.1.1" + built_value: + dependency: transitive + description: + name: built_value + sha256: fedde275e0a6b798c3296963c5cd224e3e1b55d0e478d5b7e65e6b540f363a0e + url: "https://pub.dev" + source: hosted + version: "8.9.1" characters: dependency: transitive description: @@ -33,6 +129,30 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.0" + charcode: + dependency: transitive + description: + name: charcode + sha256: fb98c0f6d12c920a02ee2d998da788bca066ca5f148492b7085ee23372b12306 + url: "https://pub.dev" + source: hosted + version: "1.3.1" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff + url: "https://pub.dev" + source: hosted + version: "2.0.3" + cli_util: + dependency: transitive + description: + name: cli_util + sha256: c05b7406fdabc7a49a3929d4af76bcaccbbffcbcdcf185b082e1ae07da323d19 + url: "https://pub.dev" + source: hosted + version: "0.4.1" clock: dependency: transitive description: @@ -41,6 +161,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.1" + code_builder: + dependency: transitive + description: + name: code_builder + sha256: f692079e25e7869c14132d39f223f8eec9830eb76131925143b2129c4bb01b37 + url: "https://pub.dev" + source: hosted + version: "4.10.0" collection: dependency: transitive description: @@ -49,6 +177,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.18.0" + convert: + dependency: transitive + description: + name: convert + sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" + url: "https://pub.dev" + source: hosted + version: "3.1.1" crypto: dependency: transitive description: @@ -57,6 +193,30 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.3" + dart_style: + dependency: transitive + description: + name: dart_style + sha256: "99e066ce75c89d6b29903d788a7bb9369cf754f7b24bf70bf4b6d6d6b26853b9" + url: "https://pub.dev" + source: hosted + version: "2.3.6" + drift: + dependency: "direct main" + description: + name: drift + sha256: "3b276c838ff7f8e19aac18a51f9b388715268f3534eaaf8047c8455ef3c1738d" + url: "https://pub.dev" + source: hosted + version: "2.16.0" + drift_dev: + dependency: "direct dev" + description: + name: drift_dev + sha256: "66cf3e397448f855523d7b6b7b3789db232b211db96543a42285464d05f3bf72" + url: "https://pub.dev" + source: hosted + version: "2.16.0" fake_async: dependency: transitive description: @@ -98,18 +258,18 @@ packages: dependency: "direct main" description: name: flutter_bloc - sha256: "87325da1ac757fcc4813e6b34ed5dd61169973871fdf181d6c2109dd6935ece1" + sha256: f0ecf6e6eb955193ca60af2d5ca39565a86b8a142452c5b24d96fb477428f4d2 url: "https://pub.dev" source: hosted - version: "8.1.4" + version: "8.1.5" flutter_lints: dependency: "direct dev" description: name: flutter_lints - sha256: e2a421b7e59244faef694ba7b30562e489c2b489866e505074eb005cd7060db7 + sha256: "9e8c3858111da373efc5aa341de011d9bd23e2c5c5e0c62bccf32438e192d7b1" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.0.2" flutter_test: dependency: "direct dev" description: flutter @@ -120,6 +280,70 @@ packages: description: flutter source: sdk version: "0.0.0" + frontend_server_client: + dependency: transitive + description: + name: frontend_server_client + sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 + url: "https://pub.dev" + source: hosted + version: "4.0.0" + glob: + dependency: transitive + description: + name: glob + sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + graphs: + dependency: transitive + description: + name: graphs + sha256: aedc5a15e78fc65a6e23bcd927f24c64dd995062bcd1ca6eda65a3cff92a4d19 + url: "https://pub.dev" + source: hosted + version: "2.3.1" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" + url: "https://pub.dev" + source: hosted + version: "3.2.1" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + url: "https://pub.dev" + source: hosted + version: "4.0.2" + io: + dependency: transitive + description: + name: io + sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" + url: "https://pub.dev" + source: hosted + version: "1.0.4" + js: + dependency: transitive + description: + name: js + sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + url: "https://pub.dev" + source: hosted + version: "0.6.7" + json_annotation: + dependency: transitive + description: + name: json_annotation + sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 + url: "https://pub.dev" + source: hosted + version: "4.8.1" leak_tracker: dependency: transitive description: @@ -152,6 +376,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.0" + logging: + dependency: transitive + description: + name: logging + sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" + url: "https://pub.dev" + source: hosted + version: "1.2.0" matcher: dependency: transitive description: @@ -176,6 +408,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.12.0" + mime: + dependency: transitive + description: + name: mime + sha256: "2e123074287cc9fd6c09de8336dae606d1ddb88d9ac47358826db698c176a1f2" + url: "https://pub.dev" + source: hosted + version: "1.0.5" nested: dependency: transitive description: @@ -184,14 +424,46 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.0" - path: + package_config: dependency: transitive + description: + name: package_config + sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + path: + dependency: "direct main" description: name: path sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" url: "https://pub.dev" source: hosted version: "1.9.0" + path_provider: + dependency: "direct main" + description: + name: path_provider + sha256: b27217933eeeba8ff24845c34003b003b2b22151de3c908d0e679e8fe1aa078b + url: "https://pub.dev" + source: hosted + version: "2.1.2" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: "477184d672607c0a3bf68fbbf601805f92ef79c82b64b4d6eb318cbca4c48668" + url: "https://pub.dev" + source: hosted + version: "2.2.2" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: "5a7999be66e000916500be4f15a3633ebceb8302719b47b9cc49ce924125350f" + url: "https://pub.dev" + source: hosted + version: "2.3.2" path_provider_linux: dependency: transitive description: @@ -232,6 +504,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.8" + pool: + dependency: transitive + description: + name: pool + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + url: "https://pub.dev" + source: hosted + version: "1.5.1" provider: dependency: transitive description: @@ -240,6 +520,30 @@ packages: url: "https://pub.dev" source: hosted version: "6.1.2" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + pubspec_parse: + dependency: transitive + description: + name: pubspec_parse + sha256: c63b2876e58e194e4b0828fcb080ad0e06d051cb607a6be51a9e084f47cb9367 + url: "https://pub.dev" + source: hosted + version: "1.2.3" + recase: + dependency: transitive + description: + name: recase + sha256: e4eb4ec2dcdee52dcf99cb4ceabaffc631d7424ee55e56f280bc039737f89213 + url: "https://pub.dev" + source: hosted + version: "4.1.0" shared_preferences: dependency: "direct main" description: @@ -296,11 +600,35 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.2" + shelf: + dependency: transitive + description: + name: shelf + sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4 + url: "https://pub.dev" + source: hosted + version: "1.4.1" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1" + url: "https://pub.dev" + source: hosted + version: "1.0.4" sky_engine: dependency: transitive description: flutter source: sdk version: "0.0.99" + source_gen: + dependency: transitive + description: + name: source_gen + sha256: "14658ba5f669685cd3d63701d01b31ea748310f7ab854e471962670abcf57832" + url: "https://pub.dev" + source: hosted + version: "1.5.0" source_span: dependency: transitive description: @@ -317,6 +645,30 @@ packages: url: "https://pub.dev" source: hosted version: "7.0.0" + sqlite3: + dependency: "direct main" + description: + name: sqlite3 + sha256: "072128763f1547e3e9b4735ce846bfd226d68019ccda54db4cd427b12dfdedc9" + url: "https://pub.dev" + source: hosted + version: "2.4.0" + sqlite3_flutter_libs: + dependency: "direct main" + description: + name: sqlite3_flutter_libs + sha256: d6c31c8511c441d1f12f20b607343df1afe4eddf24a1cf85021677c8eea26060 + url: "https://pub.dev" + source: hosted + version: "0.5.20" + sqlparser: + dependency: transitive + description: + name: sqlparser + sha256: "7b20045d1ccfb7bc1df7e8f9fee5ae58673fce6ff62cefbb0e0fd7214e90e5a0" + url: "https://pub.dev" + source: hosted + version: "0.34.1" stack_trace: dependency: transitive description: @@ -333,6 +685,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.2" + stream_transform: + dependency: transitive + description: + name: stream_transform + sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f" + url: "https://pub.dev" + source: hosted + version: "2.1.0" string_scanner: dependency: transitive description: @@ -357,6 +717,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.7.0" + timing: + dependency: transitive + description: + name: timing + sha256: "70a3b636575d4163c477e6de42f247a23b315ae20e86442bebe32d3cabf61c32" + url: "https://pub.dev" + source: hosted + version: "1.0.1" typed_data: dependency: transitive description: @@ -389,6 +757,14 @@ packages: url: "https://pub.dev" source: hosted version: "14.0.0" + watcher: + dependency: transitive + description: + name: watcher + sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" + url: "https://pub.dev" + source: hosted + version: "1.1.0" web: dependency: transitive description: @@ -397,6 +773,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.5.1" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + sha256: "1d8e795e2a8b3730c41b8a98a2dff2e0fb57ae6f0764a1c46ec5915387d257b2" + url: "https://pub.dev" + source: hosted + version: "2.4.4" win32: dependency: transitive description: @@ -413,6 +797,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.4" + yaml: + dependency: transitive + description: + name: yaml + sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" + url: "https://pub.dev" + source: hosted + version: "3.1.2" sdks: dart: ">=3.4.0-190.1.beta <4.0.0" flutter: ">=3.19.0" diff --git a/pubspec.yaml b/pubspec.yaml index a10e0b6..b52d3a0 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -7,16 +7,23 @@ environment: sdk: '>=3.4.0-190.1.beta <4.0.0' dependencies: + drift: ^2.16.0 flutter: sdk: flutter flutter_bloc: ^8.1.4 + path: ^1.9.0 + path_provider: ^2.1.2 shared_preferences: ^2.2.2 + sqlite3_flutter_libs: ^0.5.20 uuid: ^4.3.3 + sqlite3: ^2.4.0 dev_dependencies: flutter_test: sdk: flutter flutter_lints: ^3.0.0 + drift_dev: ^2.16.0 + build_runner: ^2.4.8 flutter: uses-material-design: true diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index 8b6d468..988f3c8 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -6,6 +6,9 @@ #include "generated_plugin_registrant.h" +#include void RegisterPlugins(flutter::PluginRegistry* registry) { + Sqlite3FlutterLibsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("Sqlite3FlutterLibsPlugin")); } diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index b93c4c3..8abff95 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -3,6 +3,7 @@ # list(APPEND FLUTTER_PLUGIN_LIST + sqlite3_flutter_libs ) list(APPEND FLUTTER_FFI_PLUGIN_LIST -- 2.45.2