tekartik / sembast.dart

Simple io database
BSD 2-Clause "Simplified" License
780 stars 64 forks source link

Unhandled Exception: LateInitializationError: Field 'id' has not been initialized. #333

Closed vinukn335 closed 1 year ago

vinukn335 commented 1 year ago

Getting following error while deleting any record entry:

sembast: ^3.4.0+1

E/flutter ( 7721): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: LateInitializationError: Field 'id' has not been initialized. E/flutter ( 7721): #0 JdbWriteEntry.id (package:sembast/src/jdb.dart) package:sembast/src/jdb.dart:1 E/flutter ( 7721): #1 JdbWriteEntry.toString package:sembast/src/jdb.dart:98 E/flutter ( 7721): #2 _StringBase._interpolate (dart:core-patch/string_patch.dart:853:19) E/flutter ( 7721): #3 JdbWriteEntry.value package:sembast/src/jdb.dart:88 E/flutter ( 7721): #4 JdbDatabaseSqflite._txnAddEntries package:sembast_sqflite/src/jdb_factory_sqflite.dart:333 E/flutter ( 7721): #5 JdbDatabaseSqflite.writeIfRevision. package:sembast_sqflite/src/jdb_factory_sqflite.dart:431 E/flutter ( 7721): E/flutter ( 7721): #6 SqfliteDatabaseMixin._runTransaction package:sqflite_common/src/database_mixin.dart:669 E/flutter ( 7721): E/flutter ( 7721): #7 BasicLock.synchronized package:synchronized/src/basic_lock.dart:33 E/flutter ( 7721): E/flutter ( 7721): #8 SqfliteDatabaseMixin.txnSynchronized package:sqflite_common/src/database_mixin.dart:392 E/flutter ( 7721): E/flutter ( 7721): #9 JdbDatabaseSqflite.writeIfRevision package:sembast_sqflite/src/jdb_factory_sqflite.dart:424 E/flutter ( 7721): E/flutter ( 7721): #10 SembastDatabase.transaction. package:sembast/src/database_impl.dart:1192 E/flutter ( 7721): E/flutter ( 7721): #11 BasicLock.synchronized package:synchronized/src/basic_lock.dart:33 E/flutter ( 7721): E/flutter ( 7721): #12 SembastDatabase.transaction package:sembast/src/database_impl.dart:1133 E/flutter ( 7721): E/flutter ( 7721): #13 PinStore.delete package:pin_pass/db/PinStore.dart:79 E/flutter ( 7721): E/flutter ( 7721): #14 _PinPassHomeState.removePin package:pin_pass/views/PinPassHome.dart:577 E/flutter ( 7721): E/flutter ( 7721):

code:

import 'package:flutter/foundation.dart';
import 'package:pin_pass/models/Pin.dart';
import 'package:pin_pass/db/AppDatabase.dart';
import 'package:sembast/sembast.dart';

class PinStore extends ChangeNotifier {
  static const String PIN_STORE_NAME = 'pins';
  final _pinStore = intMapStoreFactory.store(PIN_STORE_NAME);
  Future<Database> get _db async => await AppDatabase.instance.database;
  List<Pin> _pins = [];
  late Pin _pin;

  Future<int> add(Pin pin) async {
    int? _id = pin.id;

    await _pinStore.record(_id!).put(await _db, pin.toMap());
    _pins = await getAllPins();
    notifyListeners();

    return _id;
  }

  Future<List<Pin>> getAllPins() async {
    final finder = Finder(sortOrders: [SortOrder('card_name')]);
    final _snapshots = await _pinStore.find(
      await _db,
      finder: finder,
    );

    List<Pin> pins = _snapshots.map((snapshot) {
      final pin = Pin.fromMap(snapshot.value);
      return pin;
    }).toList();

    _pins = pins;
    notifyListeners();

    return pins;
  }

  Future<Pin> getPin(int id) async {
    var record = await _pinStore.record(id).get(await _db);
    Pin pin = Pin.fromMap(record!);
    return pin;
  }

  Future<void> save() async {
    final finder = Finder(filter: Filter.byKey(_pin.id as int));

    await _pinStore.update(await _db, _pin.toMap(), finder: finder);
    await getAllPins();

    return;
  }

  Future<void> activate(int id) async {
    _pin = await getPin(id);

    notifyListeners();
    return;
  }

  Future<void> delete(int id) async {
    final finder = Finder(filter: Filter.byKey(id));
    await _pinStore.delete(
      await _db,
      finder: finder,
    );

    await getAllPins();

  }

  int get count {
    return _pins.length;
  }

  List<Pin> get pinList {
    return _pins;
  }

  Pin get getActivePin {
    return _pin;
  }
}

Flutter version:

Doctor summary (to see all details, run flutter doctor -v): [✓] Flutter (Channel stable, 3.3.10, on macOS 13.0 22A380 darwin-x64, locale en-IN) Checking Android licenses is taking an unexpectedly long time...[✓] Android toolchain - develop for Android devices (Android SDK version 33.0.1) [✓] Xcode - develop for iOS and macOS (Xcode 14.2) [✗] Chrome - develop for the web (Cannot find Chrome executable at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome) ! Cannot find Chrome. Try setting CHROME_EXECUTABLE to a Chrome executable. [!] Android Studio ✗ Unable to find bundled Java version. [✓] VS Code (version 1.74.3) [✓] Connected device (2 available) [✓] HTTP Host Availability

! Doctor found issues in 2 categories.

alextekartik commented 1 year ago

Thanks for the report. It seems you are using sembast_sqlite. Are you at the latest version too (2.1.0)? Anyway it needs a fix sorry, I'll look into it

alextekartik commented 1 year ago

Sorry don't upgrade yet, I made a mistake. Let me fix that right now.

alextekartik commented 1 year ago

Sorry the package as been in an unstable state. Please upgrade to the following deps:

sembast: '>=3.4.0+5'
sembast_sqflite: '>=2.1.0+1'
(if needed)
sembast_web: '>=2.1.0+4'