language
language copied to clipboard
Macro API can't generate new types based on methods and properties from the base class
I was trying to use the new dart feature Macro
to generate the repetitive code in the Mix framework (@leoafarias). Initially, I aimed to simplify the API by generating new classes from a base class. For instance:
@GenerateModifier()
class OpacityModifier {
final double opacity;
const OpacityModifier(this.opacity);
@override
Widget build(Widget child) {
assert(
opacity >= 0.0 && opacity <= 1.0,
'The opacity must be between 0.0 and 1.0 (inclusive).',
);
return Opacity(opacity: opacity, child: child);
}
}
and then it will generate three more classes based on these properties and methods, OpacityModifierSpec
, OpacityModifierAttribute
, and OpacityUtility
, they will be like:
class OpacityModifierSpec extends WidgetModifierSpec<OpacityModifierSpec> {
final double opacity;
const OpacityModifierSpec(this.opacity);
@override
OpacityModifierSpec lerp(OpacityModifierSpec? other, double t) {
return OpacityModifierSpec(
lerpDouble(opacity, other?.opacity, t) ?? opacity,
);
}
@override
OpacityModifierSpec copyWith({double? opacity}) {
return OpacityModifierSpec(opacity ?? this.opacity);
}
@override
get props => [opacity];
@override
Widget build(Widget child) {
assert(
opacity >= 0.0 && opacity <= 1.0,
'The opacity must be between 0.0 and 1.0 (inclusive).',
);
return Opacity(opacity: opacity, child: child);
}
}
class OpacityModifierAttribute extends WidgetModifierAttribute<
OpacityModifierAttribute, OpacityModifierSpec> {
final double opacity;
const OpacityModifierAttribute(this.opacity);
@override
OpacityModifierAttribute merge(OpacityModifierAttribute? other) {
return OpacityModifierAttribute(other?.opacity ?? opacity);
}
@override
OpacityModifierSpec resolve(MixData mix) {
return OpacityModifierSpec(opacity);
}
@override
get props => [opacity];
}
class OpacityUtility<T extends Attribute>
extends MixUtility<T, OpacityModifierAttribute> {
const OpacityUtility(super.builder);
T call(double value) => builder(OpacityModifierAttribute(value));
}
The problem is that the ClassTypeBuilder
on ClassTypesMacro
can't return the properties and methods. Why can't ClassTypesMacro
access these values? What do you suggest to solve this?