isar / isar/hive

Issue with openBox and typeAdapters

Open
#543 9 comments 0 reactions 0 assignees View on GitHub
Dominant language
Dart
Stars
4.4k
Forks
449
PR merge metrics
No merged PRs in 30d

Description

I noticed an old closed ticket about the same subject so I opened a new one. My issue is at next comment.

> Getting the same error again. Here is the stacktrace:
>
> ```
> _CastError
> type '_OneByteString' is not a subtype of type 'int' in type cast
> user.g.dart in UserAdapter.read at line 17
> binary_reader_impl.dart in BinaryReaderImpl.read at line 321
> binary_reader_impl.dart in BinaryReaderImpl.readFrame at line 266
> frame_helper.dart in FrameHelper.framesFromBytes at line 16
> frame_io_helper.dart in FrameIoHelper.framesFromFile at line 37
> Called from:
> storage_backend_vm.dart in StorageBackendVm.initialize at line 74
> Called from:
> box_base_impl.dart in BoxBaseImpl.initialize at line 82
> hive_impl.dart in HiveImpl._openBox at line 95
> Called from:
> hive_impl.dart in HiveImpl.openBox at line 112
> main.dart in main._openBoxes at line 30
> Called from:
> main.dart in main at line 42
> Called from: async_patch.dart in _AsyncAwaitCompleter.start
> main.dart in main at line 20
> Called from: hooks.dart in _runMainZoned..
> ```
>
> This is what I do in main.dart
>
>
> ```
> void main() async {
> WidgetsFlutterBinding.ensureInitialized();
>
> Future _openBoxes() async {
> await Hive.initFlutter();
> return Future.wait([
> Hive.openBox('user'),
> Hive.openBox('submenu'),
> ]);
> }
>
> Hive.registerAdapter(UserAdapter(), 1);
> Hive.registerAdapter(SubMenuAdapter(), 2);
> Hive.registerAdapter(MenuTypeAdapter(), 3);
> await _openBoxes();
>
> runApp(
> ChangeNotifierProvider(
> create: (context) => AuthProvider()..init(),
> child: Oregon(),
> ),
> );
> }
> ```
>
>
> User class:
>
> ```
> @HiveType()
> class User extends HiveObject {
> @HiveField(0)
> int userId;
> @HiveField(1)
> int driverId;
> @HiveField(2)
> String name;
> @HiveField(3)
> String email;
> @HiveField(4)
> String password;
> @HiveField(5)
> String authToken;

> @HiveField(6)
> String gsm;
> @HiveField(7)
> String avatarUrl;
>
> @HiveField(8)
> String timeZone;
> @HiveField(9)
> String locale;
> @HiveField(10)
> String language;
>
> User({
> this.userId,
> this.driverId,
> this.name,
> this.email,
> this.password,
> this.authToken,
> this.gsm,
> this.timeZone,
> this.locale,
> this.language,
> this.avatarUrl,
> });
> }
> ```
>
> auto generated UserAdapter:
> The corresponding line in stacktrace for this file is
>
> `userId: fields[0] as int`
>
> ```
> class UserAdapter extends TypeAdapter {
> @override
> User read(BinaryReader reader) {
> var numOfFields = reader.readByte();
> var fields = {
> for (var i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
> };
> return User(
> userId: fields[0] as int,
> driverId: fields[1] as int,
> name: fields[2] as String,
> email: fields[3] as String,
> password: fields[4] as String,
> authToken: fields[5] as String,
> gsm: fields[6] as String,
> timeZone: fields[8] as String,
> locale: fields[9] as String,
> language: fields[10] as String,
> avatarUrl: fields[7] as String,
> );
> }
>
> @override
> void write(BinaryWriter writer, User obj) {
> writer
> ..writeByte(11)
> ..writeByte(0)
> ..write(obj.userId)
> ..writeByte(1)
> ..write(obj.driverId)
> ..writeByte(2)
> ..write(obj.name)
> ..writeByte(3)
> ..write(obj.email)
> ..writeByte(4)
> ..write(obj.password)
> ..writeByte(5)
> ..write(obj.authToken)
> ..writeByte(6)
> ..write(obj.gsm)
> ..writeByte(7)
> ..write(obj.avatarUrl)
> ..writeByte(8)
> ..write(obj.timeZone)
> ..writeByte(9)
> ..write(obj.locale)
> ..writeByte(10)
> ..write(obj.language);
> }
> }
> ```
>
> Do you think this is related to Hive?

_Originally posted by @selimkundakci in https://github.com/hivedb/hive/issues/214#issuecomment-589606229_

Contributor guide

No contributing guide indexed for this repository

Research direction

Start by reproducing the failure through Hive.openBox in main.dart and trace the value from BinaryReaderImpl.read to user.g.dart's UserAdapter.read, especially fields[0] as int. Compare the serialized User fields with the adapter's reads and determine whether the typeAdapter data is decoded consistently; done means identifying the cause and verifying that opening the box no longer raises the reported cast error.

Written by the indexing model from the issue text.

Assessment

Tech stack
dart, flutter
Domain
databases
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.