flutterdartflutter-hivefreezed

combine freezed & hive


I'm searching for a solution to combine freezed and hive packages. For example like that:

@freezed
abstract class Person extends HiveObject with _$Person {
  @HiveType(typeId: 0)
  factory Person({@HiveField(0) String name, @HiveField(1) int age}) = _Person;
}

I know that this is not possible out of the box, but I think you know what I want to achieve. What would be the best way to implement freezed with hive?

The only solution that I can currently think of is to store the json-String which is generated by freezed in hive. But I hope there is a better solution.


Solution

  • yes, it is now possible, make sure your min version is hive_generator: ^0.7.2+1.

    as an example you could write:

    import 'package:freezed_annotation/freezed_annotation.dart';
    import 'package:hive/hive.dart';
    
    part 'immutable_class.freezed.dart';
    part 'immutable_class.g.dart';
    
    @freezed
    abstract class ImmutableClass with _$ImmutableClass {
      @HiveType(typeId: 5, adapterName: 'ImmutableClassAdapter')
      const factory ImmutableClass({
        @JsonKey(name: 'id', required: true, disallowNullValue: true) @HiveField(0) int id,
        @HiveField(1) int someField1,
        @HiveField(2) String someField2,
      }) = _ImmutableClass;
    
      factory ImmutableClass.fromJson(Map<String, dynamic> json) => _$ImmutableClassFromJson(json);
    }
    

    the only disadvantage is that you should specify the name of your adaptor.

    update

    in freezed: ^2.3.2 you can simply do the following

    @freezed
    abstract class ImmutableClass extends HiveObject with _$ImmutableClass {
      
      ImmutableClass._();
    
      @HiveType(typeId: 5)
      factory Person({@HiveField(1) int someField1, @HiveField(2) String someField2}) = _ImmutableClass;
    }