Skip to content

Default non-constant value for factory parameterย #5

@chikamichi

Description

@chikamichi

Hi (again) ๐Ÿ‘‹

I have this ValueObject implementing a [0.0; 1.0] double inclusive range:

import "package:freezed_annotation/freezed_annotation.dart";
import "package:modddels_annotation_fpdart/modddels_annotation_fpdart.dart";

part 'percentage.modddel.dart';
part 'percentage.freezed.dart';

@Modddel(
  validationSteps: [
    ValidationStep([Validation("range", FailureType<RangeFailure>())]),
  ],
)
class Percentage extends SingleValueObject<InvalidPercentage, ValidPercentage>
    with _$Percentage {
  Percentage._();

  factory Percentage(double value) {
    return _$Percentage._create(
      value: value,
    );
  }

  @override
  Option<RangeFailure> validateRange(percentage) {
    if (percentage.value < 0.0) {
      return some(const RangeFailure.min());
    }
    if (percentage.value > 1.0) {
      return some(const RangeFailure.max());
    }
    return none();
  }
}

@freezed
class RangeFailure extends ValueFailure with _$RangeFailure {
  const factory RangeFailure.min() = _Min;
  const factory RangeFailure.max() = _Max;
}

Which is leveraged in this kind of modddel factories:

class MapLayer extends SimpleEntity<InvalidMapLayer, ValidMapLayer>
    with _$MapLayer {
  MapLayer._();

  factory MapLayer.raster(
      {required MapLayerPosition position,
      required URI uri,
      @validParam bool loaded = false,
      @validParam bool enabled = false,
      Percentage opacity = 1.0}) {
    return _$MapLayer._createRaster(
      position: position,
      uri: uri,
      loaded: loaded,
      enabled: enabled,
      opacity: opacity,
    );
  }

  // etc.
}

The opacity attribute has an error: A value of type 'double' canโ€™t be assigned to a variable of type 'Percentage'.

Should I somehow use Percentage(1.0) instead of the 1.0 literal? In which case I get the (expected) following error: The default value of an optional parameter must be constant.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestfeedback wantedSuggestions and opinions are needed

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions