Skip to content

Frontend complains about non-matching type from mixin and base class #31984

Closed
@aam

Description

@aam

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.

Metadata

Metadata

Labels

P0A serious issue requiring immediate resolutionlegacy-area-front-endLegacy: Use area-dart-model instead.

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions