prefer-mixin

Same as prefer_mixin in Dart lints

Group
Style
Path
lint/style/prefer-mixin
Default
On (recommended)
Origin
Dart lints
Rule
385 of 512
recommended

Flags with clauses that mix in a plain class instead of a mixin.

Dart 3 only lets mixin and mixin class declarations be mixed in from other libraries; mixing in an ordinary class is a legacy pattern that also couples the class's constructor-free shape to every user. Declare the reusable behavior as a mixin.

class Logger { void log(String m) {} }
class Service with Logger {}  // flagged

mixin Logging { void log(String m) {} }
class Worker with Logging {}  // preferred

Resolved plain classes are reported regardless of their declaring library.

Invalid

example.dartdart
class Logger {
  void log(String message) {}
}

class Tracer {
  void trace() {}
}

abstract class Disposable {
  void dispose() {}
}

class Service with Logger {}

class Worker extends Object with Logger, Tracer {}

class Resource with Disposable {}

class Alias = Object with Tracer;

enum Level with Logger {
  low,
  high,
}

class LocalLoggerConsumer with Logger {}
Only mixins should be mixed in.
12
13class Service with Logger {}
Only mixins should be mixed in.
14
15class Worker extends Object with Logger, Tracer {}
Only mixins should be mixed in.
14
15class Worker extends Object with Logger, Tracer {}
Only mixins should be mixed in.
16
17class Resource with Disposable {}
Only mixins should be mixed in.
18
19class Alias = Object with Tracer;
Only mixins should be mixed in.
20
21enum Level with Logger {
Only mixins should be mixed in.
25
26class LocalLoggerConsumer with Logger {}

Valid

example.dartdart
import 'dart:collection';

mixin Logging {
  void log(String message) {}
}

mixin class Tracing {
  void trace() {}
}

class Service with Logging {}

class Worker extends Object with Logging, Tracing {}

class Alias = Object with Tracing;

enum Level with Logging { low, high }

// SDK mixins are fine.
class Numbers with ListMixin<int> {
  @override
  int length = 0;

  @override
  int operator [](int index) => index;

  @override
  void operator []=(int index, int value) {}
}

// Unresolved types are left alone.
class Remote with SomeUnknownMixin {}

// Extending or implementing a class is not mixing it in.
class Base {}

class Derived extends Base {}

class Impl implements Base {}

Configure prefer-mixin

Set its severity in falcon.json. See the configuration guide.

falcon.jsonjson
{
  "linter": {
    "rules": {
      "style": {
        "prefer-mixin": "error"
      }
    }
  }
}

Or silence one occurrence with a suppression comment; the reason is required.

example.dartdart
// falcon-ignore lint/style/prefer-mixin: <reason>