isar / hive

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

Generator not building file for Freezed class #987

Open aardrop opened 2 years ago

aardrop commented 2 years ago

Steps to Reproduce We use Hive for our settings and we have it attached to a Freezed class as well. We are on the most recent version of both platforms. The freezer generator file builds without fail but the hive file does not. Actually, it only will build if I add or remove the 'abstract' keyword. Once I change the 'abstract' (either adding or removing it) it will build the generator file BUT the next time the generator runs it will remove the file again and I will have to change it again to trigger a rebuild.
``

Code sample

import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:hive/hive.dart';
import 'package:hive_flutter/hive_flutter.dart';

import 'package:../domain/settings/settings.dart';

part 'settings_dto.freezed.dart';
part 'settings_dto.g.dart';

@freezed
class SettingsDto with _$SettingsDto {
  @HiveType(typeId: 1, adapterName: 'SettingsDtoAdapter')
  const SettingsDto._();
  @HiveType(typeId: 0)
  const factory SettingsDto({
    @HiveField(0) final String? id,
    @HiveField(1) final String? units,
  }) = _SettingsDto;

  factory SettingsDto.fromDomain(Settings settings) {
    return SettingsDto(
      id: settings.id,
      units: settings.units.name,
    );
  }

  Units stringToEnumUnits(String unitsStr) {
    Units u =
        Units.values.firstWhere((e) => e.toString() == 'Units.' + unitsStr);
    return u;
  }

  Settings toDomain() => Settings(
        id: id,
        units: units == null ? Units.imperial : stringToEnumUnits(units!),
      );
}

Version

Nightwelf commented 2 years ago

same problem :(

nullxception commented 2 years ago

Hi. I had the same issues recently, and managed to solve it by reordering the builder sequence so hive_generator will run after freezed but before json_serializable.

# build.yaml
global_options:
  freezed:freezed:
    runs_before:
      - hive_generator:hive_generator
  hive_generator:hive_generator:
    runs_before:
      - json_serializable:json_serializable

though I'm not sure if it'll bring another issues to the table or not.

Rexios80 commented 1 year ago

This should be in the readme

alguintu commented 1 year ago

Using freezed 2.4.3 with Hive now generates ObjectImplAdapter instead of ObjectAdapter in the .g.dart file and breaks existing imports.

Breaking change in Freezed 2.4.3

This is supposed to be intended behavior, and hive is not supposed to be using the internal Impl class as per Remi. Importing the new ObjectImplAdapter still works though, for now.