diff --git a/example/android/gradle/wrapper/gradle-wrapper.properties b/example/android/gradle/wrapper/gradle-wrapper.properties index 3c472b9..0c85a1f 100644 --- a/example/android/gradle/wrapper/gradle-wrapper.properties +++ b/example/android/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.1-bin.zip +networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip diff --git a/example/lib/main.dart b/example/lib/main.dart index b38572a..255ad1a 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -1,12 +1,22 @@ -import 'package:example/src/rick_and_morty_app.dart'; +import 'package:example/src/object_box.dart'; +import 'package:example/src/event_test_app.dart'; import 'package:flutter/material.dart'; import 'package:logging/logging.dart'; +import 'package:provider/provider.dart'; -void main() { +void main() async { Logger.root.level = Level.ALL; Logger.root.onRecord.listen((record) { debugPrint('${record.level.name}: ${record.time}: ${record.message}'); }); - runApp(const RickAndMortyApp()); + var db = await ObjectBox.create(); + + runApp( + Provider( + create: (context) => db, + dispose: (context, value) { db.store.close(); }, + child: EventTestApp(db: db), + ) + ); } diff --git a/example/lib/objectbox-model.json b/example/lib/objectbox-model.json new file mode 100644 index 0000000..27a6679 --- /dev/null +++ b/example/lib/objectbox-model.json @@ -0,0 +1,44 @@ +{ + "_note1": "KEEP THIS FILE! Check it into a version control system (VCS) like git.", + "_note2": "ObjectBox manages crucial IDs for your object model. See docs for details.", + "_note3": "If you have VCS merge conflicts, you must resolve them according to ObjectBox docs.", + "entities": [ + { + "id": "1:6709955693638076712", + "lastPropertyId": "3:1942125423904776272", + "name": "Event", + "properties": [ + { + "id": "1:636801918188349586", + "name": "id", + "type": 6, + "flags": 1 + }, + { + "id": "2:3159909911057681959", + "name": "timestamp", + "type": 10, + "flags": 8, + "indexId": "1:4390567391463897551" + }, + { + "id": "3:1942125423904776272", + "name": "name", + "type": 9 + } + ], + "relations": [] + } + ], + "lastEntityId": "1:6709955693638076712", + "lastIndexId": "1:4390567391463897551", + "lastRelationId": "0:0", + "lastSequenceId": "0:0", + "modelVersion": 5, + "modelVersionParserMinimum": 5, + "retiredEntityUids": [], + "retiredIndexUids": [], + "retiredPropertyUids": [], + "retiredRelationUids": [], + "version": 1 +} \ No newline at end of file diff --git a/example/lib/objectbox.g.dart b/example/lib/objectbox.g.dart new file mode 100644 index 0000000..f5c06bf --- /dev/null +++ b/example/lib/objectbox.g.dart @@ -0,0 +1,143 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND +// This code was generated by ObjectBox. To update it run the generator again +// with `dart run build_runner build`. +// See also https://docs.objectbox.io/getting-started#generate-objectbox-code + +// ignore_for_file: camel_case_types, depend_on_referenced_packages +// coverage:ignore-file + +import 'dart:typed_data'; + +import 'package:flat_buffers/flat_buffers.dart' as fb; +import 'package:objectbox/internal.dart' + as obx_int; // generated code can access "internal" functionality +import 'package:objectbox/objectbox.dart' as obx; +import 'package:objectbox_flutter_libs/objectbox_flutter_libs.dart'; + +import 'src/event.dart'; + +export 'package:objectbox/objectbox.dart'; // so that callers only have to import this file + +final _entities = [ + obx_int.ModelEntity( + id: const obx_int.IdUid(1, 6709955693638076712), + name: 'Event', + lastPropertyId: const obx_int.IdUid(3, 1942125423904776272), + flags: 0, + properties: [ + obx_int.ModelProperty( + id: const obx_int.IdUid(1, 636801918188349586), + name: 'id', + type: 6, + flags: 1), + obx_int.ModelProperty( + id: const obx_int.IdUid(2, 3159909911057681959), + name: 'timestamp', + type: 10, + flags: 8, + indexId: const obx_int.IdUid(1, 4390567391463897551)), + obx_int.ModelProperty( + id: const obx_int.IdUid(3, 1942125423904776272), + name: 'name', + type: 9, + flags: 0) + ], + relations: [], + backlinks: []) +]; + +/// Shortcut for [obx.Store.new] that passes [getObjectBoxModel] and for Flutter +/// apps by default a [directory] using `defaultStoreDirectory()` from the +/// ObjectBox Flutter library. +/// +/// Note: for desktop apps it is recommended to specify a unique [directory]. +/// +/// See [obx.Store.new] for an explanation of all parameters. +/// +/// For Flutter apps, also calls `loadObjectBoxLibraryAndroidCompat()` from +/// the ObjectBox Flutter library to fix loading the native ObjectBox library +/// on Android 6 and older. +Future openStore( + {String? directory, + int? maxDBSizeInKB, + int? maxDataSizeInKB, + int? fileMode, + int? maxReaders, + bool queriesCaseSensitiveDefault = true, + String? macosApplicationGroup}) async { + await loadObjectBoxLibraryAndroidCompat(); + return obx.Store(getObjectBoxModel(), + directory: directory ?? (await defaultStoreDirectory()).path, + maxDBSizeInKB: maxDBSizeInKB, + maxDataSizeInKB: maxDataSizeInKB, + fileMode: fileMode, + maxReaders: maxReaders, + queriesCaseSensitiveDefault: queriesCaseSensitiveDefault, + macosApplicationGroup: macosApplicationGroup); +} + +/// Returns the ObjectBox model definition for this project for use with +/// [obx.Store.new]. +obx_int.ModelDefinition getObjectBoxModel() { + final model = obx_int.ModelInfo( + entities: _entities, + lastEntityId: const obx_int.IdUid(1, 6709955693638076712), + lastIndexId: const obx_int.IdUid(1, 4390567391463897551), + lastRelationId: const obx_int.IdUid(0, 0), + lastSequenceId: const obx_int.IdUid(0, 0), + retiredEntityUids: const [], + retiredIndexUids: const [], + retiredPropertyUids: const [], + retiredRelationUids: const [], + modelVersion: 5, + modelVersionParserMinimum: 5, + version: 1); + + final bindings = { + Event: obx_int.EntityDefinition( + model: _entities[0], + toOneRelations: (Event object) => [], + toManyRelations: (Event object) => {}, + getId: (Event object) => object.id, + setId: (Event object, int id) { + object.id = id; + }, + objectToFB: (Event object, fb.Builder fbb) { + final nameOffset = fbb.writeString(object.name); + fbb.startTable(4); + fbb.addInt64(0, object.id); + fbb.addInt64(1, object.timestamp.millisecondsSinceEpoch); + fbb.addOffset(2, nameOffset); + fbb.finish(fbb.endTable()); + return object.id; + }, + objectFromFB: (obx.Store store, ByteData fbData) { + final buffer = fb.BufferContext(fbData); + final rootOffset = buffer.derefObject(0); + final timestampParam = DateTime.fromMillisecondsSinceEpoch( + const fb.Int64Reader().vTableGet(buffer, rootOffset, 6, 0)); + final nameParam = const fb.StringReader(asciiOptimization: true) + .vTableGet(buffer, rootOffset, 8, ''); + final object = Event(timestamp: timestampParam, name: nameParam) + ..id = const fb.Int64Reader().vTableGet(buffer, rootOffset, 4, 0); + + return object; + }) + }; + + return obx_int.ModelDefinition(model, bindings); +} + +/// [Event] entity fields to define ObjectBox queries. +class Event_ { + /// See [Event.id]. + static final id = obx.QueryIntegerProperty(_entities[0].properties[0]); + + /// See [Event.timestamp]. + static final timestamp = + obx.QueryDateProperty(_entities[0].properties[1]); + + /// See [Event.name]. + static final name = + obx.QueryStringProperty(_entities[0].properties[2]); +} diff --git a/example/lib/src/event.dart b/example/lib/src/event.dart new file mode 100644 index 0000000..d5f9eae --- /dev/null +++ b/example/lib/src/event.dart @@ -0,0 +1,18 @@ +import 'package:objectbox/objectbox.dart'; + +@Entity() +class Event { + @Id() + int id = 0; + + @Index() + @Property(type: PropertyType.date) + final DateTime timestamp; + + final String name; + + Event({ + required this.timestamp, + required this.name + }); +} \ No newline at end of file diff --git a/example/lib/src/event_card.dart b/example/lib/src/event_card.dart new file mode 100644 index 0000000..c109a77 --- /dev/null +++ b/example/lib/src/event_card.dart @@ -0,0 +1,24 @@ +import 'package:example/src/event.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; + +class EventCard extends StatelessWidget { + final Event eventData; + + const EventCard({ + super.key, + required this.eventData, + }); + + @override + Widget build(BuildContext context) { + return Column( + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(eventData.name), + Text(DateFormat.Hms().format(eventData.timestamp.toLocal())) + ], + ); + } +} \ No newline at end of file diff --git a/example/lib/src/event_dao.dart b/example/lib/src/event_dao.dart new file mode 100644 index 0000000..026092a --- /dev/null +++ b/example/lib/src/event_dao.dart @@ -0,0 +1,67 @@ +import 'dart:math'; + +import 'package:example/objectbox.g.dart'; +import 'package:example/src/event.dart'; + +class EventDao { + final Store store; + final Box eventBox; + + EventDao({ + required this.store + }) : eventBox = store.box(); + + Future> getFutureEventsAsync(DateTime from, int limit, int offset) async { + await ensureEventsExist(); + + final fromDay = DateTime(from.year, from.month, from.day); + + var builder = eventBox + .query(Event_.timestamp.greaterOrEqual(fromDay.millisecondsSinceEpoch)) + .order(Event_.timestamp); + + var query = builder + .build() + ..offset = offset + ..limit = limit; + + return await query.findAsync(); + } + + Future> getPastEventsAsync(DateTime from, int limit, int offset) async { + await ensureEventsExist(); + + final fromDay = DateTime(from.year, from.month, from.day); + + var builder = eventBox + .query(Event_.timestamp.lessThan(fromDay.millisecondsSinceEpoch)) + .order(Event_.timestamp, flags: Order.descending); + + var query = builder + .build() + ..offset = offset + ..limit = limit; + + return await query.findAsync(); + } + + Future ensureEventsExist() async { + final eventCount = eventBox.count(); + + if (eventCount == 0) { + final random = Random(); + final now = DateTime.now(); + + final events = List.generate(100, (index) { + final randomDays = random.nextInt(365) * (random.nextBool() ? 1 : -1); + final randomDate = now.add(Duration(days: randomDays)); + return Event( + timestamp: randomDate, + name: 'Random Event #${index + 1}', + ); + }); + + await eventBox.putManyAsync(events); + } + } +} \ No newline at end of file diff --git a/example/lib/src/event_source.dart b/example/lib/src/event_source.dart new file mode 100644 index 0000000..99941a7 --- /dev/null +++ b/example/lib/src/event_source.dart @@ -0,0 +1,40 @@ +import 'package:example/src/event.dart'; +import 'package:super_paging/super_paging.dart'; +import 'package:example/src/object_box.dart'; + +class EventsSource extends PagingSource { + final ObjectBox db; + final DateTime currentTime; + + EventsSource({ + required this.db, + required this.currentTime + }); + + @override + Future> load(LoadParams params) async { + var pageToLoad = params.key ?? 0; + + try { + if (pageToLoad >= 0) { + final events = await db.eventDao.getFutureEventsAsync(currentTime, params.loadSize, params.loadSize * pageToLoad); + + return LoadResult.page( + items: events, + prevKey: pageToLoad - 1, + nextKey: pageToLoad + 1, + ); + } else { + final events = await db.eventDao.getPastEventsAsync(currentTime, params.loadSize, params.loadSize * pageToLoad); + + return LoadResult.page( + items: events, + prevKey: pageToLoad - 1, + nextKey: pageToLoad + 1, + ); + } + } catch (e) { + return LoadResult.error(e); + } + } +} \ No newline at end of file diff --git a/example/lib/src/event_test_app.dart b/example/lib/src/event_test_app.dart new file mode 100644 index 0000000..c62e601 --- /dev/null +++ b/example/lib/src/event_test_app.dart @@ -0,0 +1,89 @@ +import 'package:example/src/event.dart'; +import 'package:example/src/event_card.dart'; +import 'package:example/src/event_source.dart'; +import 'package:example/src/object_box.dart'; +import 'package:flutter/material.dart'; +import 'package:super_paging/super_paging.dart'; + +class EventTestApp extends StatelessWidget { + final ObjectBox db; + + const EventTestApp({ + super.key, + required this.db + }); + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Rick and Morty', + theme: ThemeData(useMaterial3: true), + home: EventTestPage(db: db), + ); + } +} + +class EventTestPage extends StatefulWidget { + final ObjectBox db; + + const EventTestPage({ + super.key, + required this.db + }); + + @override + State createState() => _EventTestPageState(); +} + +class _EventTestPageState extends State { + late final Pager pager; + final DateTime currentTime = DateTime(DateTime.now().year, DateTime.now().month, DateTime.now().day); + + @override + void initState() { + pager = Pager( + initialKey: 0, + config: const PagingConfig(pageSize: 20, initialLoadSize: 60), + pagingSourceFactory: () => EventsSource(currentTime: currentTime, db: widget.db), + ); + + super.initState(); + } + + @override + void dispose() { + pager.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return BidirectionalPagingListView( + pager: pager, + + itemBuilder: (BuildContext context, int index) { + final eventData = pager.items.elementAt(index); + + return EventCard( + eventData: eventData, + ); + }, + + emptyBuilder: (BuildContext context) { + return const Center( + child: Text('No characters found'), + ); + }, + + errorBuilder: (BuildContext context, Object? error) { + return Center(child: Text('$error')); + }, + + loadingBuilder: (BuildContext context) { + return const Center( + child: CircularProgressIndicator.adaptive(), + ); + }, + ); + } +} diff --git a/example/lib/src/object_box.dart b/example/lib/src/object_box.dart new file mode 100644 index 0000000..864baf5 --- /dev/null +++ b/example/lib/src/object_box.dart @@ -0,0 +1,22 @@ +import 'package:example/objectbox.g.dart'; +import 'package:example/src/event_dao.dart'; + +class ObjectBox { + final Store store; + + EventDao get eventDao => EventDao(store: store); + + ObjectBox({ + required this.store, + }); + + static Future createStore() async { + return Store(getObjectBoxModel(), directory: "memory:test-db"); + } + + static Future create() async { + final store = await createStore(); + + return ObjectBox(store: store); + } +} \ No newline at end of file diff --git a/example/lib/src/rick_and_morty_api.dart b/example/lib/src/rick_and_morty_api.dart deleted file mode 100644 index 271e88a..0000000 --- a/example/lib/src/rick_and_morty_api.dart +++ /dev/null @@ -1,21 +0,0 @@ -import 'dart:convert'; - -import 'package:example/src/rick_and_morty_data.dart'; - -import 'package:http/http.dart' as http; - -class RickAndMortyApi { - late final _client = http.Client(); - - Future getCharacters({required int page}) async { - final res = await _client.get( - Uri.parse("https://rickandmortyapi.com/api/character?page=$page"), - ); - - if (res.statusCode != 200) { - throw Exception("Error getting movies"); - } - - return RickAndMortyData.fromJson(jsonDecode(res.body)); - } -} diff --git a/example/lib/src/rick_and_morty_app.dart b/example/lib/src/rick_and_morty_app.dart deleted file mode 100644 index c0ac245..0000000 --- a/example/lib/src/rick_and_morty_app.dart +++ /dev/null @@ -1,74 +0,0 @@ -import 'package:example/src/rick_and_morty_api.dart'; -import 'package:example/src/rick_and_morty_source.dart'; -import 'package:flutter/material.dart'; -import 'package:super_paging/super_paging.dart'; - -class RickAndMortyApp extends StatelessWidget { - const RickAndMortyApp({super.key}); - - @override - Widget build(BuildContext context) { - return MaterialApp( - title: 'Rick and Morty', - theme: ThemeData(useMaterial3: true), - home: const RickAndMortyPage(), - ); - } -} - -class RickAndMortyPage extends StatefulWidget { - const RickAndMortyPage({super.key}); - - @override - State createState() => _RickAndMortyPageState(); -} - -class _RickAndMortyPageState extends State { - late final rickAndMortyPager = Pager( - initialKey: 1, // Initial page to load. - config: const PagingConfig(pageSize: 20, initialLoadSize: 60), - pagingSourceFactory: () => RickAndMortySource(api: RickAndMortyApi()), - ); - - @override - void dispose() { - rickAndMortyPager.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: const Text('Rick and Morty'), - ), - body: BidirectionalPagingListView( - pager: rickAndMortyPager, - itemBuilder: (BuildContext context, int index) { - final item = rickAndMortyPager.items.elementAt(index); - - return ListTile( - key: ValueKey(item.id), - title: Text(item.name), - subtitle: Text(item.species), - trailing: Text('# ${item.id}'), - leading: CircleAvatar(backgroundImage: NetworkImage(item.image)), - ); - }, - emptyBuilder: (BuildContext context) { - return const Center( - child: Text('No characters found'), - ); - }, - errorBuilder: (BuildContext context, Object? error) { - return Center(child: Text('$error')); - }, - loadingBuilder: (BuildContext context) { - return const Center( - child: CircularProgressIndicator.adaptive(), - ); - }, - ), - ); - } -} diff --git a/example/lib/src/rick_and_morty_data.dart b/example/lib/src/rick_and_morty_data.dart deleted file mode 100644 index 2aafdc7..0000000 --- a/example/lib/src/rick_and_morty_data.dart +++ /dev/null @@ -1,83 +0,0 @@ -import 'package:json_annotation/json_annotation.dart'; - -part 'rick_and_morty_data.g.dart'; - -@JsonSerializable(createToJson: false) -class RickAndMortyData { - const RickAndMortyData({ - required this.info, - required this.results, - }); - - factory RickAndMortyData.fromJson(Map json) => - _$RickAndMortyDataFromJson(json); - - final RickAndMortyInfo info; - final List results; -} - -@JsonSerializable(createToJson: false) -class RickAndMortyInfo { - const RickAndMortyInfo({ - required this.count, - required this.pages, - required this.next, - required this.prev, - }); - - factory RickAndMortyInfo.fromJson(Map json) => - _$RickAndMortyInfoFromJson(json); - - final int count; - final int pages; - final String? next; - final String? prev; -} - -@JsonSerializable(createToJson: false) -class RickAndMortyCharacter { - const RickAndMortyCharacter({ - required this.id, - required this.name, - required this.status, - required this.species, - required this.type, - required this.gender, - required this.origin, - required this.location, - required this.image, - required this.episode, - required this.url, - required this.created, - }); - - factory RickAndMortyCharacter.fromJson(Map json) => - _$RickAndMortyCharacterFromJson(json); - - final int id; - final String name; - final String status; - final String species; - final String type; - final String gender; - final RickAndMortyLocation origin; - final RickAndMortyLocation location; - final String image; - final List episode; - final String url; - final String created; -} - -@JsonSerializable(createToJson: false) -class RickAndMortyLocation { - const RickAndMortyLocation({ - required this.name, - required this.url, - }); - - factory RickAndMortyLocation.fromJson(Map json) => - _$RickAndMortyLocationFromJson(json); - - final String name; - final String url; -} diff --git a/example/lib/src/rick_and_morty_data.g.dart b/example/lib/src/rick_and_morty_data.g.dart deleted file mode 100644 index 4d6b799..0000000 --- a/example/lib/src/rick_and_morty_data.g.dart +++ /dev/null @@ -1,50 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'rick_and_morty_data.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -RickAndMortyData _$RickAndMortyDataFromJson(Map json) => - RickAndMortyData( - info: RickAndMortyInfo.fromJson(json['info'] as Map), - results: (json['results'] as List) - .map((e) => RickAndMortyCharacter.fromJson(e as Map)) - .toList(), - ); - -RickAndMortyInfo _$RickAndMortyInfoFromJson(Map json) => - RickAndMortyInfo( - count: json['count'] as int, - pages: json['pages'] as int, - next: json['next'] as String?, - prev: json['prev'] as String?, - ); - -RickAndMortyCharacter _$RickAndMortyCharacterFromJson( - Map json) => - RickAndMortyCharacter( - id: json['id'] as int, - name: json['name'] as String, - status: json['status'] as String, - species: json['species'] as String, - type: json['type'] as String, - gender: json['gender'] as String, - origin: - RickAndMortyLocation.fromJson(json['origin'] as Map), - location: RickAndMortyLocation.fromJson( - json['location'] as Map), - image: json['image'] as String, - episode: - (json['episode'] as List).map((e) => e as String).toList(), - url: json['url'] as String, - created: json['created'] as String, - ); - -RickAndMortyLocation _$RickAndMortyLocationFromJson( - Map json) => - RickAndMortyLocation( - name: json['name'] as String, - url: json['url'] as String, - ); diff --git a/example/lib/src/rick_and_morty_source.dart b/example/lib/src/rick_and_morty_source.dart deleted file mode 100644 index 3de7e14..0000000 --- a/example/lib/src/rick_and_morty_source.dart +++ /dev/null @@ -1,42 +0,0 @@ -import 'package:super_paging/super_paging.dart'; - -import 'rick_and_morty_data.dart'; -import 'rick_and_morty_api.dart'; - -class RickAndMortySource extends PagingSource { - const RickAndMortySource({required this.api}); - - final RickAndMortyApi api; - - @override - Future> load( - LoadParams params, - ) async { - try { - final page = params.key ?? 1; - final data = await api.getCharacters(page: page); - - int? nextPage; - if (data.info.next != null) { - final uri = Uri.parse(data.info.next!); - final nextPageQuery = uri.queryParameters['page']; - if (nextPageQuery != null) nextPage = int.parse(nextPageQuery); - } - - int? prevPage; - if (data.info.prev != null) { - final uri = Uri.parse(data.info.prev!); - final prevPageQuery = uri.queryParameters['page']; - if (prevPageQuery != null) prevPage = int.parse(prevPageQuery); - } - - return LoadResult.page( - items: data.results, - nextKey: nextPage, - prevKey: prevPage, - ); - } catch (e) { - return LoadResult.error(e); - } - } -} diff --git a/example/linux/flutter/generated_plugin_registrant.cc b/example/linux/flutter/generated_plugin_registrant.cc index e71a16d..c58ebc9 100644 --- a/example/linux/flutter/generated_plugin_registrant.cc +++ b/example/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) objectbox_flutter_libs_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "ObjectboxFlutterLibsPlugin"); + objectbox_flutter_libs_plugin_register_with_registrar(objectbox_flutter_libs_registrar); } diff --git a/example/linux/flutter/generated_plugins.cmake b/example/linux/flutter/generated_plugins.cmake index 2e1de87..94262e7 100644 --- a/example/linux/flutter/generated_plugins.cmake +++ b/example/linux/flutter/generated_plugins.cmake @@ -3,6 +3,7 @@ # list(APPEND FLUTTER_PLUGIN_LIST + objectbox_flutter_libs ) list(APPEND FLUTTER_FFI_PLUGIN_LIST diff --git a/example/macos/Flutter/GeneratedPluginRegistrant.swift b/example/macos/Flutter/GeneratedPluginRegistrant.swift index cccf817..a7ec112 100644 --- a/example/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,6 +5,10 @@ import FlutterMacOS import Foundation +import objectbox_flutter_libs +import path_provider_foundation func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + ObjectboxFlutterLibsPlugin.register(with: registry.registrar(forPlugin: "ObjectboxFlutterLibsPlugin")) + PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) } diff --git a/example/pubspec.lock b/example/pubspec.lock new file mode 100644 index 0000000..7eb2e6a --- /dev/null +++ b/example/pubspec.lock @@ -0,0 +1,761 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + sha256: "16e298750b6d0af7ce8a3ba7c18c69c3785d11b15ec83f6dcd0ad2a0009b3cab" + url: "https://pub.dev" + source: hosted + version: "76.0.0" + _macros: + dependency: transitive + description: dart + source: sdk + version: "0.3.3" + analyzer: + dependency: transitive + description: + name: analyzer + sha256: "1f14db053a8c23e260789e9b0980fa27f2680dd640932cae5e1137cce0e46e1e" + url: "https://pub.dev" + source: hosted + version: "6.11.0" + args: + dependency: transitive + description: + name: args + sha256: bf9f5caeea8d8fe6721a9c358dd8a5c1947b27f1cfaa18b39c301273594919e6 + url: "https://pub.dev" + source: hosted + version: "2.6.0" + async: + dependency: transitive + description: + name: async + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + url: "https://pub.dev" + source: hosted + version: "2.11.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + 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: "79b2aef6ac2ed00046867ed354c88778c9c0f029df8a20fe10b5436826721ef9" + url: "https://pub.dev" + source: hosted + version: "4.0.2" + 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: "74691599a5bc750dc96a6b4bfd48f7d9d66453eab04c7f4063134800d6a5c573" + url: "https://pub.dev" + source: hosted + version: "2.4.14" + build_runner_core: + dependency: transitive + description: + name: build_runner_core + sha256: "22e3aa1c80e0ada3722fe5b63fd43d9c8990759d0a2cf489c8c5d7b2bdebc021" + url: "https://pub.dev" + source: hosted + version: "8.0.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: c7913a9737ee4007efedaffc968c049fd0f3d0e49109e778edc10de9426005cb + url: "https://pub.dev" + source: hosted + version: "8.9.2" + cancellation_token: + dependency: transitive + description: + name: cancellation_token + sha256: ad95acf9d4b2f3563e25dc937f63587e46a70ce534e910b65d10e115490f1027 + url: "https://pub.dev" + source: hosted + version: "2.0.1" + characters: + dependency: transitive + description: + name: characters + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + url: "https://pub.dev" + source: hosted + version: "1.3.0" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff + url: "https://pub.dev" + source: hosted + version: "2.0.3" + clock: + dependency: transitive + description: + name: clock + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" + source: hosted + version: "1.1.1" + code_builder: + dependency: transitive + description: + name: code_builder + sha256: "0ec10bf4a89e4c613960bf1e8b42c64127021740fb21640c29c909826a5eea3e" + url: "https://pub.dev" + source: hosted + version: "4.10.1" + collection: + dependency: transitive + description: + name: collection + sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf + url: "https://pub.dev" + source: hosted + version: "1.19.0" + convert: + dependency: transitive + description: + name: convert + sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 + url: "https://pub.dev" + source: hosted + version: "3.1.2" + crypto: + dependency: transitive + description: + name: crypto + sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" + url: "https://pub.dev" + source: hosted + version: "3.0.6" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 + url: "https://pub.dev" + source: hosted + version: "1.0.8" + dart_style: + dependency: transitive + description: + name: dart_style + sha256: "7856d364b589d1f08986e140938578ed36ed948581fbc3bc9aef1805039ac5ab" + url: "https://pub.dev" + source: hosted + version: "2.3.7" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" + source: hosted + version: "1.3.1" + ffi: + dependency: transitive + description: + name: ffi + sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6" + url: "https://pub.dev" + source: hosted + version: "2.1.3" + file: + dependency: transitive + description: + name: file + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 + url: "https://pub.dev" + source: hosted + version: "7.0.1" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be + url: "https://pub.dev" + source: hosted + version: "1.1.1" + flat_buffers: + dependency: transitive + description: + name: flat_buffers + sha256: "380bdcba5664a718bfd4ea20a45d39e13684f5318fcd8883066a55e21f37f4c3" + url: "https://pub.dev" + source: hosted + version: "23.5.26" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: "9e8c3858111da373efc5aa341de011d9bd23e2c5c5e0c62bccf32438e192d7b1" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + freezed_annotation: + dependency: transitive + description: + name: freezed_annotation + sha256: c2e2d632dd9b8a2b7751117abcfc2b4888ecfe181bd9fca7170d9ef02e595fe2 + url: "https://pub.dev" + source: hosted + version: "2.4.4" + 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: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + http: + dependency: "direct main" + description: + name: http + sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010 + url: "https://pub.dev" + source: hosted + version: "1.2.2" + 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" + intl: + dependency: "direct main" + description: + name: intl + sha256: "00f33b908655e606b86d2ade4710a231b802eec6f11e87e4ea3783fd72077a50" + url: "https://pub.dev" + source: hosted + version: "0.20.1" + io: + dependency: transitive + description: + name: io + sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b + url: "https://pub.dev" + source: hosted + version: "1.0.5" + js: + dependency: transitive + description: + name: js + sha256: c1b2e9b5ea78c45e1a0788d29606ba27dc5f71f019f32ca5140f61ef071838cf + url: "https://pub.dev" + source: hosted + version: "0.7.1" + json_annotation: + dependency: "direct main" + description: + name: json_annotation + sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" + url: "https://pub.dev" + source: hosted + version: "4.9.0" + json_serializable: + dependency: "direct dev" + description: + name: json_serializable + sha256: c2fcb3920cf2b6ae6845954186420fca40bc0a8abcc84903b7801f17d7050d7c + url: "https://pub.dev" + source: hosted + version: "6.9.0" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06" + url: "https://pub.dev" + source: hosted + version: "10.0.7" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379" + url: "https://pub.dev" + source: hosted + version: "3.0.8" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + url: "https://pub.dev" + source: hosted + version: "3.0.1" + lints: + dependency: transitive + description: + name: lints + sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290 + url: "https://pub.dev" + source: hosted + version: "3.0.0" + logging: + dependency: "direct main" + description: + name: logging + sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 + url: "https://pub.dev" + source: hosted + version: "1.3.0" + macros: + dependency: transitive + description: + name: macros + sha256: "1d9e801cd66f7ea3663c45fc708450db1fa57f988142c64289142c9b7ee80656" + url: "https://pub.dev" + source: hosted + version: "0.1.3-main.0" + matcher: + dependency: transitive + description: + name: matcher + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb + url: "https://pub.dev" + source: hosted + version: "0.12.16+1" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + url: "https://pub.dev" + source: hosted + version: "0.11.1" + meta: + dependency: transitive + description: + name: meta + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 + url: "https://pub.dev" + source: hosted + version: "1.15.0" + mime: + dependency: transitive + description: + name: mime + sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + nested: + dependency: transitive + description: + name: nested + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + objectbox: + dependency: "direct main" + description: + name: objectbox + sha256: ea823f4bf1d0a636e7aa50b43daabb64dd0fbd80b85a033016ccc1bc4f76f432 + url: "https://pub.dev" + source: hosted + version: "4.0.3" + objectbox_flutter_libs: + dependency: "direct main" + description: + name: objectbox_flutter_libs + sha256: c91350bbbce5e6c2038255760b5be988faead004c814f833c2cd137445c6ae70 + url: "https://pub.dev" + source: hosted + version: "4.0.3" + objectbox_generator: + dependency: "direct dev" + description: + name: objectbox_generator + sha256: "96da521f2cef455cd524f8854e31d64495c50711ad5f1e2cf3142a8e527bc75f" + url: "https://pub.dev" + source: hosted + version: "4.0.3" + package_config: + dependency: transitive + description: + name: package_config + sha256: "92d4488434b520a62570293fbd33bb556c7d49230791c1b4bbd973baf6d2dc67" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + path: + dependency: transitive + description: + name: path + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" + url: "https://pub.dev" + source: hosted + version: "1.9.0" + path_provider: + dependency: transitive + description: + name: path_provider + sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" + url: "https://pub.dev" + source: hosted + version: "2.1.5" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: "4adf4fd5423ec60a29506c76581bc05854c55e3a0b72d35bb28d661c9686edf2" + url: "https://pub.dev" + source: hosted + version: "2.2.15" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + url: "https://pub.dev" + source: hosted + version: "2.2.1" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 + url: "https://pub.dev" + source: hosted + version: "2.3.0" + platform: + dependency: transitive + description: + name: platform + sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" + url: "https://pub.dev" + source: hosted + version: "3.1.6" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + pointycastle: + dependency: transitive + description: + name: pointycastle + sha256: "4be0097fcf3fd3e8449e53730c631200ebc7b88016acecab2b0da2f0149222fe" + url: "https://pub.dev" + source: hosted + version: "3.9.1" + pool: + dependency: transitive + description: + name: pool + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + url: "https://pub.dev" + source: hosted + version: "1.5.1" + provider: + dependency: "direct main" + description: + name: provider + sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c + url: "https://pub.dev" + source: hosted + version: "6.1.2" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "7b3cfbf654f3edd0c6298ecd5be782ce997ddf0e00531b9464b55245185bbbbd" + url: "https://pub.dev" + source: hosted + version: "2.1.5" + pubspec_parse: + dependency: transitive + description: + name: pubspec_parse + sha256: c799b721d79eb6ee6fa56f00c04b472dcd44a30d258fac2174a6ec57302678f8 + url: "https://pub.dev" + source: hosted + version: "1.3.0" + 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: cc36c297b52866d203dbf9332263c94becc2fe0ceaa9681d07b6ef9807023b67 + url: "https://pub.dev" + source: hosted + version: "2.0.1" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + source_gen: + dependency: transitive + description: + name: source_gen + sha256: "14658ba5f669685cd3d63701d01b31ea748310f7ab854e471962670abcf57832" + url: "https://pub.dev" + source: hosted + version: "1.5.0" + source_helper: + dependency: transitive + description: + name: source_helper + sha256: "6adebc0006c37dd63fe05bca0a929b99f06402fc95aa35bf36d67f5c06de01fd" + url: "https://pub.dev" + source: hosted + version: "1.3.4" + source_span: + dependency: transitive + description: + name: source_span + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + url: "https://pub.dev" + source: hosted + version: "1.10.0" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" + url: "https://pub.dev" + source: hosted + version: "1.12.0" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + 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: + name: string_scanner + sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" + url: "https://pub.dev" + source: hosted + version: "1.3.0" + super_paging: + dependency: "direct main" + description: + path: ".." + relative: true + source: path + version: "0.2.0" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + test_api: + dependency: transitive + description: + name: test_api + sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" + url: "https://pub.dev" + source: hosted + version: "0.7.3" + timing: + dependency: transitive + description: + name: timing + sha256: "62ee18aca144e4a9f29d212f5a4c6a053be252b895ab14b5821996cff4ed90fe" + url: "https://pub.dev" + source: hosted + version: "1.0.2" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b + url: "https://pub.dev" + source: hosted + version: "14.3.0" + watcher: + dependency: transitive + description: + name: watcher + sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + web: + dependency: transitive + description: + name: web + sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb + url: "https://pub.dev" + source: hosted + version: "1.1.0" + web_socket: + dependency: transitive + description: + name: web_socket + sha256: "3c12d96c0c9a4eec095246debcea7b86c0324f22df69893d538fcc6f1b8cce83" + url: "https://pub.dev" + source: hosted + version: "0.1.6" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + sha256: "9f187088ed104edd8662ca07af4b124465893caf063ba29758f97af57e61da8f" + url: "https://pub.dev" + source: hosted + version: "3.0.1" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + yaml: + dependency: transitive + description: + name: yaml + sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" + url: "https://pub.dev" + source: hosted + version: "3.1.2" +sdks: + dart: ">=3.6.0 <4.0.0" + flutter: ">=3.24.0" diff --git a/example/pubspec.yaml b/example/pubspec.yaml index b50fd87..2cfdd01 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -16,13 +16,18 @@ dependencies: json_annotation: ^4.8.1 super_paging: path: ../ + objectbox: ^4.0.3 + objectbox_flutter_libs: any + intl: ^0.20.1 + provider: ^6.1.2 dev_dependencies: flutter_test: sdk: flutter flutter_lints: ^3.0.1 json_serializable: ^6.7.1 - build_runner: ^2.4.8 + build_runner: ^2.4.14 + objectbox_generator: any flutter: uses-material-design: true diff --git a/example/windows/flutter/CMakeLists.txt b/example/windows/flutter/CMakeLists.txt index 930d207..903f489 100644 --- a/example/windows/flutter/CMakeLists.txt +++ b/example/windows/flutter/CMakeLists.txt @@ -10,6 +10,11 @@ include(${EPHEMERAL_DIR}/generated_config.cmake) # https://github.com/flutter/flutter/issues/57146. set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") +# Set fallback configurations for older versions of the flutter tool. +if (NOT DEFINED FLUTTER_TARGET_PLATFORM) + set(FLUTTER_TARGET_PLATFORM "windows-x64") +endif() + # === Flutter Library === set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") @@ -92,7 +97,7 @@ add_custom_command( COMMAND ${CMAKE_COMMAND} -E env ${FLUTTER_TOOL_ENVIRONMENT} "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" - windows-x64 $ + ${FLUTTER_TARGET_PLATFORM} $ VERBATIM ) add_custom_target(flutter_assemble DEPENDS diff --git a/example/windows/flutter/generated_plugin_registrant.cc b/example/windows/flutter/generated_plugin_registrant.cc index 8b6d468..a84779d 100644 --- a/example/windows/flutter/generated_plugin_registrant.cc +++ b/example/windows/flutter/generated_plugin_registrant.cc @@ -6,6 +6,9 @@ #include "generated_plugin_registrant.h" +#include void RegisterPlugins(flutter::PluginRegistry* registry) { + ObjectboxFlutterLibsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("ObjectboxFlutterLibsPlugin")); } diff --git a/example/windows/flutter/generated_plugins.cmake b/example/windows/flutter/generated_plugins.cmake index b93c4c3..9f0138e 100644 --- a/example/windows/flutter/generated_plugins.cmake +++ b/example/windows/flutter/generated_plugins.cmake @@ -3,6 +3,7 @@ # list(APPEND FLUTTER_PLUGIN_LIST + objectbox_flutter_libs ) list(APPEND FLUTTER_FFI_PLUGIN_LIST diff --git a/example/windows/runner/flutter_window.cpp b/example/windows/runner/flutter_window.cpp index b25e363..955ee30 100644 --- a/example/windows/runner/flutter_window.cpp +++ b/example/windows/runner/flutter_window.cpp @@ -31,6 +31,11 @@ bool FlutterWindow::OnCreate() { this->Show(); }); + // Flutter can complete the first frame before the "show window" callback is + // registered. The following call ensures a frame is pending to ensure the + // window is shown. It is a no-op if the first frame hasn't completed yet. + flutter_controller_->ForceRedraw(); + return true; } diff --git a/lib/src/paging_state.dart b/lib/src/paging_state.dart index 25cbf82..7fe6346 100644 --- a/lib/src/paging_state.dart +++ b/lib/src/paging_state.dart @@ -47,12 +47,10 @@ sealed class PagingState with _$PagingState { /// Extension methods for [PagingList]. extension PagingListExtension on List> { - /// Returns the [Key] for the previous page to be fetched if available, - /// `null` otherwise. + /// Returns the [Key] for the previous page to be fetched if available, `null` otherwise. Key? get prevKey => firstOrNull?.prevKey; - /// Returns the [Key] for the next page to be fetched if available, - /// `null` otherwise. + /// Returns the [Key] for the next page to be fetched if available, `null` otherwise. Key? get nextKey => lastOrNull?.nextKey; /// Returns all the loaded items accumulated from [pages]. @@ -61,19 +59,15 @@ extension PagingListExtension on List> { /// Returns the total number of items in [pages]. int get itemCount => fold(0, (acc, it) => acc + it.items.length); - /// Returns `True` if all loaded pages are empty or no pages were loaded when - /// this [Success] was created, `False` otherwise. + /// Returns `True` if all loaded pages are empty or no pages were loaded when this [Success] was created, `False` otherwise. bool get isListEmpty => isEmpty || every((it) => it.items.isEmpty); - /// Returns `True` if there is at least one loaded page with items when this - /// [Success] was created, `False` otherwise. + /// Returns `True` if there is at least one loaded page with items when this [Success] was created, `False` otherwise. bool get isListNotEmpty => isNotEmpty && any((it) => it.items.isNotEmpty); - /// Returns the first loaded item in the list or `null` if all loaded pages - /// are empty or no pages were loaded when this [Success] was created. + /// Returns the first loaded item in the list or `null` if all loaded pages are empty or no pages were loaded when this [Success] was created. Value? get firstItemOrNull => firstOrNull?.items.firstOrNull; - /// Returns the last loaded item in the list or `null` if all loaded pages are - /// empty or no pages were loaded when this [Success] was created. + /// Returns the last loaded item in the list or `null` if all loaded pages are empty or no pages were loaded when this [Success] was created. Value? get lastItemOrNull => lastOrNull?.items.lastOrNull; } diff --git a/lib/src/widget/bidirectional_paging_list_view.dart b/lib/src/widget/bidirectional_paging_list_view.dart index a80e806..6495cae 100644 --- a/lib/src/widget/bidirectional_paging_list_view.dart +++ b/lib/src/widget/bidirectional_paging_list_view.dart @@ -182,8 +182,7 @@ class BidirectionalPagingListView extends StatefulWidget { _BidirectionalPagingListViewState(); } -class _BidirectionalPagingListViewState - extends State> { +class _BidirectionalPagingListViewState extends State> { Pager get pager => widget.pager; void _loadInitialIfRequired() { @@ -204,8 +203,7 @@ class _BidirectionalPagingListViewState } @override - void didUpdateWidget( - covariant BidirectionalPagingListView oldWidget) { + void didUpdateWidget(covariant BidirectionalPagingListView oldWidget) { super.didUpdateWidget(oldWidget); if (oldWidget.pager != widget.pager) { _loadInitialIfRequired(); @@ -229,8 +227,7 @@ class _BidirectionalPagingListViewState return Center(child: errorWidget); }, loading: () { - // We are only going to show the loading widget if there are no - // pages. + // We are only going to show the loading widget if there are no pages. if (pages.isListEmpty) { final loadingWidget = widget.loadingBuilder.call(context); return Center(child: loadingWidget); @@ -354,8 +351,7 @@ class _BidirectionalPagingListViewState }); }, onBuildingAppendLoadTriggerItem: () { - // If the bottom list contain items, we don't need to handle - // append here. + // If the bottom list contain items, we don't need to handle append here. if (!bottomPages.isListEmpty) return; // Schedules the request for the end of this frame. @@ -374,8 +370,7 @@ class _BidirectionalPagingListViewState delegate: _createDelegate( bottomPages, onBuildingPrependLoadTriggerItem: () { - // If the top list contain items, we don't need to handle - // prepend here. + // If the top list contain items, we don't need to handle prepend here. if (!topPages.isListEmpty) return; // Schedules the request for the end of this frame. @@ -439,12 +434,10 @@ class _BidirectionalPagingListViewState // Helper function to generate prepend and append load trigger notifications void generatePrependAppendLoadTriggerNotification(int index) { - // If there is no prefetch index, we don't need to generate any - // notifications. + // If there is no prefetch index, we don't need to generate any notifications. if (prefetchIndex == null) return; - // Check if the index is near the edge of the list based on the prefetch - // index and the direction of the list. + // Check if the index is near the edge of the list based on the prefetch index and the direction of the list. final (shouldPrependItems, shouldAppendItems) = switch (reverse) { true => (index >= itemCount - prefetchIndex, index <= prefetchIndex), false => (index <= prefetchIndex, index >= itemCount - prefetchIndex),