Skip to content

noSuchMethod isn't getting called on web on beta/dev channels (works fine on stable) #50750

Closed
@westy92

Description

@westy92

In my sample code, on the Web platform, noSuchMethod(...) is not getting invoked. It works fine on stable, but is not working on beta/dev/master.

I have tested with MacOS (latest, 13.0.1) on Chrome (latest, Version 108.0.5359.124 (Official Build) (x86_64)). Also tested on DartPad.

Problematic versions:

  • current beta (dart 2.19.0-444.1.beta)
  • current dev
  • current master (2.19.0-467.0.dev)

Works fine on the latest stable version (2.18.5)!

Expected behavior:

inside noSuchMethod

Actual behavior:

Uncaught Error: NoSuchMethodError: method not found: '_value'
Receiver: Instance of 'MyDateTime'
Arguments: []

Sample code:

class MyDateTime implements DateTime {
  const MyDateTime(int year)
      : _year = year;
  final int _year;

  DateTime get dateTime {
    return DateTime(_year);
  }

  @override
  DateTime add(Duration duration) {
    return dateTime.add(duration);
  }

  @override
  int compareTo(DateTime other) {
    return dateTime.compareTo(other);
  }

  @override
  int get day => dateTime.day;

  @override
  Duration difference(DateTime other) {
    return dateTime.difference(other);
  }

  @override
  int get hashCode => dateTime.hashCode;

  @override
  int get hour => dateTime.hour;

  @override
  bool isAfter(DateTime other) {
    return dateTime.isAfter(other);
  }

  @override
  bool isAtSameMomentAs(DateTime other) {
    return dateTime.isAtSameMomentAs(other);
  }

  @override
  bool isBefore(DateTime other) {
    return dateTime.isBefore(other);
  }

  @override
  bool get isUtc => dateTime.isUtc;

  @override
  int get microsecond => dateTime.microsecond;

  @override
  int get microsecondsSinceEpoch => dateTime.microsecondsSinceEpoch;

  @override
  int get millisecond => dateTime.millisecond;

  @override
  int get millisecondsSinceEpoch => dateTime.millisecondsSinceEpoch;

  @override
  int get minute => dateTime.minute;

  @override
  int get month => dateTime.month;

  @override
  int get second => dateTime.second;

  @override
  DateTime subtract(Duration duration) {
    return dateTime.subtract(duration);
  }

  @override
  String get timeZoneName => dateTime.timeZoneName;

  @override
  Duration get timeZoneOffset => dateTime.timeZoneOffset;

  @override
  String toIso8601String() {
    return dateTime.toIso8601String();
  }

  @override
  DateTime toLocal() {
    return dateTime.toLocal();
  }

  @override
  DateTime toUtc() {
    return dateTime.toUtc();
  }

  @override
  int get weekday => dateTime.weekday;

  @override
  int get year => dateTime.year;

  @override
  bool operator ==(Object other) {
    return dateTime == other;
  }

  @override
  dynamic noSuchMethod(Invocation invocation) {
    print('inside noSuchMethod');
    return 0;
  }
}

void main() {
    final d1 = DateTime(2022, 2);
    final d2 = const MyDateTime(2022);
    d1.difference(d2);
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions