isar / hive

Lightweight and blazing fast key-value database written in pure Dart.
Apache License 2.0
4.04k stars 402 forks source link

NoSuchMethodError: The getter 'length' was called on null. #443

Closed andreademasi closed 4 years ago

andreademasi commented 4 years ago

Steps to Reproduce I'm trying to write an object from a dart package (enough_email) into hive db. More specifically i was writing a MimeMessage object. I wrote the necessary custom adapters, it might be useful to know that i didn't save all the properties from the original object.

Code sample

 if (emailDB.isEmpty) {
   var mails = await getMails();
      for (var mail in mails) {
        emailDB.add(mail); // <-- exception triggered
      }
 }

// Custom Adapters
class EmailAdapter extends TypeAdapter<MimeMessage> {
  @override
  final typeId = 0;

  @override
  MimeMessage read(BinaryReader reader) {
    return MimeMessage()
      ..headers = reader.readList()
      ..from = reader.readList()
      ..replyTo = reader.readList()
      ..bodyRaw = reader.readString()
      ..flags = reader.readStringList();
  }

  @override
  void write(BinaryWriter writer, MimeMessage obj) {
    print(obj);
    writer.writeList(obj.headers);
    writer.writeList(obj.from);
    writer.writeList(obj.replyTo);
    writer.writeString(obj.bodyRaw);
    writer.writeStringList(obj.flags);
  }
}

class HeaderAdapter extends TypeAdapter<Header> {
  @override
  final typeId = 1;

  @override
  Header read(BinaryReader reader) {
    var name = reader.readString();
    var value = reader.readString();
    return Header(name, value);
  }

  @override
  void write(BinaryWriter writer, Header obj) {
    writer.writeString(obj.name);
    writer.writeString(obj.value);
  }
}

class MailAddressAdapter extends TypeAdapter<MailAddress> {
  @override
  final typeId = 2;

  @override
  MailAddress read(BinaryReader reader) {
    var email = reader.readString();
    var name = reader.readString();
    return MailAddress(name, email);
  }

  @override
  void write(BinaryWriter writer, MailAddress obj) {
    writer.writeString(obj.email);
    writer.writeString(obj.personalName);
  }
}

Version

themisir commented 4 years ago

Could you write stack trace of the given error?

andreademasi commented 4 years ago

Could you write stack trace of the given error?

E/flutter (13157): [ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: NoSuchMethodError: The getter 'length' was called on null.
E/flutter (13157): Receiver: null
E/flutter (13157): Tried calling: length
E/flutter (13157): #0      Object.noSuchMethod  (dart:core-patch/object_patch.dart:51:5)
E/flutter (13157): #1      BinaryWriterImpl.writeStringList 
package:hive/…/binary/binary_writer_impl.dart:189
E/flutter (13157): #2      EmailAdapter.write 
package:polito_app/…/providers/mailClient.dart:121
E/flutter (13157): #3      BinaryWriterImpl.write 
package:hive/…/binary/binary_writer_impl.dart:316
E/flutter (13157): #4      BinaryWriterImpl.writeFrame 
E/flutter (13157): #6      ReadWriteSync.syncWrite.<anonymous closure> 
package:hive/…/vm/read_write_sync.dart:26
E/flutter (13157): #7      _rootRunUnary  (dart:async/zone.dart:1198:47)
E/flutter (13157): #8      _CustomZone.runUnary  (dart:async/zone.dart:1100:19)
E/flutter (13157): #9      _FutureListener.handleValue  (dart:async/future_impl.dart:143:18)
E/flutter (13157): #10     Future._propagateToListeners.handleValueCallback  (dart:async/future_impl.dart:696:45)
E/flutter (13157): #11     Future._propagateToListeners  (dart:async/future_impl.dart:725:32)
E/flutter (13157): #12     Future._addListener.<anonymous closure>  (dart:async/future_impl.dart:393:9)
E/flutter (13157): #13     _rootRun  (dart:async/zone.dart:1190:13)
E/flutter (13157): #14     _CustomZone.run  (dart:async/zone.dart:1093:19)
E/flutter (13157): #15     _CustomZone.runGuarded  (dart:async/zone.dart:997:7)
E/flutter (13157): #16     _CustomZone.bindCallbackGuarded.<anonymous closure>  (dart:async/zone.dart:1037:23)
E/flutter (13157): #17     _microtaskLoop  (dart:async/schedule_microtask.dart:41:21)
E/flutter (13157): #18     _startMicrotaskLoop  (dart:async/schedule_microtask.dart:50:5)
andreademasi commented 4 years ago

Looks like that the error is caused by the flags field, which should be a list of strings.. might be that it's nullable?

simc commented 4 years ago

@andreademasi You created this adapter youself right? All the .writeSomeType() methods require you to only provide non-null data. This is not documented well but it'll be much easier to see once Hive start using NNBD types.

Edit: You can always take a look at generated adapters for reference.