DEV Community

Jhin Lee
Jhin Lee

Posted on • Edited on

Interesting Dart Syntax: mixin application class

Recently I just got to know this dart syntax. You can define a class with a mixin like this:

class Foo = Bar with Baz;
Enter fullscreen mode Exit fullscreen mode

Without the syntax, you would probably do this:

class Foo extends Bar with Baz {
  Foo(): super();
}
Enter fullscreen mode Exit fullscreen mode

Currently, there is an issue in DDC with the syntax, so probably better not to use it for the flutter web project yet:

Error with private variable setters in mixins on dart web. #50119

dart --version 2.19.0-266.0.dev, also on stable / beta channels web / chrome

Very similar issue to https://github.com/dart-lang/sdk/issues/44636.

Simplest reproduction so far: Edit: See @schultek's minimum sample below for a simpler reproduction.

  • dart create -t web-simple call_stack_overflow && cd call_stack_overflow
  • Replace main with the following
import 'dart:html';
import 'package:riverpod/riverpod.dart';

void main() {
  final container = ProviderContainer();
  final value = container.read(stringValue.state);
  querySelector('#output')?.text = 'Your ${value.state} app is running.';
}

final stringValue = StateProvider.autoDispose((ref) => 'Hello world');
Enter fullscreen mode Exit fullscreen mode
  • Add Riverpod to pubspec with riverpod: ^2.0.0
  • Run sample with webdev serve
  • Visit web app and check the console.

Stack overflow on private setter in a mixin. Making the field in the package public shifts the error to another private member.

 .......
    at set [_keepAliveLinks] (auto_dispose.dart:42:7)
    at set [_keepAliveLinks] (auto_dispose.dart:42:7)
    at set [_keepAliveLinks] (auto_dispose.dart:42:7)
    at AutoDisposeProviderElementMixin.<computed> (auto_dispose.dart:6:24)
    at StateProviderElement_AutoDisposeProviderElementMixin$36.__ (base.dart:81:48)
    at new AutoDisposeStateProviderElement.__ (auto_dispose.dart:42:7)
    at AutoDisposeStateProvider.new.createElement (auto_dispose.dart:31:44)
    at [_create] (container.dart:49:32)
    at framework._StateReader.new.getElement (container.dart:41:52)
    at container.dart:434:37
    at framework.ProviderContainer.new.readProviderElement (container.dart:466:14)
    at ProviderElementProxy.new.read (proxy_provider_listenable.dart:112:25)
    at framework.ProviderContainer.new.read (container.dart:257:20)
    at main$ (main.dart:25:26)
    at main.dart.bootstrap.js:273:10
    at Array.forEach (<anonymous>)
    at window.$dartRunMain (main.dart.bootstrap.js:272:32)
    at <anonymous>:1:8
    at Object.runMain (client.js:8777:21)

Originally reported here: https://github.com/rrousselGit/riverpod/issues/1713

I tried creating a more minimal sample, but was unsuccessful.

But I pretty much like the syntax that makes the code cleaner.

Top comments (0)