Closed
Description
From #31975 (comment)
╰─➤ cat mixin.dart
class StatefulWidget {}
abstract class State<T extends StatefulWidget> {
T get widget => _widget;
T _widget;
}
class _AnimatedCrossFadeState extends State<AnimatedCrossFade> with TickerProviderStateMixin {}
class AnimatedCrossFade extends StatefulWidget {}
abstract class TickerProvider {}
class TickerProviderStateMixin extends State<dynamic> implements TickerProvider {
factory TickerProviderStateMixin._() => null;
}
void main() {}% ╰─➤ $DH/sdk/pkg/vm/tool/dart2 mixin.dart
mixin.dart: Error: The parameter '_' of the method '_AnimatedCrossFadeState::_widget' has type #lib1::AnimatedCrossFade, which does not match the corresponding type in the overridden method (dynamic).
Change to a supertype of dynamic (or, for a covariant parameter, a subtype).
mixin.dart:15:7: Error: This is the overriden method ('_widget').
class TickerProviderStateMixin extends State<dynamic> implements TickerProvider {
^
mixin.dart: Error: The parameter '_' of the method '_AnimatedCrossFadeState::_widget' has type #lib1::AnimatedCrossFade, which does not match the corresponding type in the overridden method (dynamic).
Change to a supertype of dynamic (or, for a covariant parameter, a subtype).
mixin.dart:15:7: Error: This is the overriden method ('_widget').
class TickerProviderStateMixin extends State<dynamic> implements TickerProvider {
^
Changing TickerProviderStateMixin
to extend State<StatefulWidget>
doesn't fix the problem.
Looking at generated kernel though, everything looks as expected, and only #error
points to the error.
library;
import self as self;
import "dart:core" as core;
class StatefulWidget extends core::Object {
synthetic constructor •() → void
: super core::Object::•()
;
}
abstract class State<T extends self::StatefulWidget> extends core::Object {
generic-covariant-impl generic-covariant-interface field self::State::T _widget = null;
synthetic constructor •() → void
: super core::Object::•()
;
get widget() → self::State::T
return this.{self::State::_widget};
}
abstract class _State&TickerProviderStateMixin^#U0^<#U0 extends core::Object> extends self::State<self::_State&TickerProviderStateMixin^#U0^::#U0> implements self::TickerProviderStateMixin {
synthetic constructor •() → void
: super self::State::•()
;
static factory _() → self::TickerProviderStateMixin
return null;
}
class _AnimatedCrossFadeState extends self::_State&TickerProviderStateMixin^#U0^<self::AnimatedCrossFade> {
synthetic constructor •() → void
: super self::State::•()
;
abstract forwarding-stub set _widget(generic-covariant-impl self::AnimatedCrossFade _) → void;
}
class AnimatedCrossFade extends self::StatefulWidget {
synthetic constructor •() → void
: super self::StatefulWidget::•()
;
}
abstract class TickerProvider extends core::Object {
synthetic constructor •() → void
: super core::Object::•()
;
}
class TickerProviderStateMixin extends self::State<self::StatefulWidget> implements self::TickerProvider {
static factory _() → self::TickerProviderStateMixin
return null;
abstract forwarding-stub set _widget(generic-covariant-impl self::StatefulWidget _) → void;
}
static const field dynamic #errors = const <dynamic>["mixin.dart: \u0027[31mError: The parameter '_' of the method '_AnimatedCrossFadeState::_widget' has type #lib1::AnimatedCrossFade, which does not match the corresponding type in the overridden method (#lib1::StatefulWidget).\nChange to a supertype of #lib1::StatefulWidget (or, for a covariant parameter, a subtype).\u0027[39;49m"]/* from null */;
static method main() → void {}
Assigning to @peter-ahe-google , please reassign if there is somebody else who is better suited to look at this.