no-magic-string

Path
lint/suspicious/no-magic-string
Default
Off, opt in
Origin
Falcon
Rule
293 of 512

Extract inline string literals into named variables or constants. Exempts direct literal initializers, defaults, annotations, constant collections, indices, asserts, and direct string arguments of regex/URI/error constructors, common string operations and ignored-invocations (default print, debugPrint). allow-only-once (false) allows values occurring only once across expression/pattern literals. Literal patterns are exempt from diagnostics but still count; directive strings do not count.

Invalid

example.dartdart
void f(dynamic value) {
  consume('message');
  final instance = Model('inline');
  if (value == 'ready') {}
  returnValue('result');
  value.message = 'updated';
  consume(r'raw');
  if ('admin'.contains(value)) {}
  'a-b'.split('-');
  value.contains(User(name: 'admin'));
  print(User(name: 'nested'));
  final s = '${lookup("magic-key")}';
}
Extract this magic string into a named variable or constant.
1void f(dynamic value) {
2 consume('message');
Extract this magic string into a named variable or constant.
2 consume('message');
3 final instance = Model('inline');
Extract this magic string into a named variable or constant.
3 final instance = Model('inline');
4 if (value == 'ready') {}
Extract this magic string into a named variable or constant.
4 if (value == 'ready') {}
5 returnValue('result');
Extract this magic string into a named variable or constant.
5 returnValue('result');
6 value.message = 'updated';
Extract this magic string into a named variable or constant.
6 value.message = 'updated';
7 consume(r'raw');
Extract this magic string into a named variable or constant.
7 consume(r'raw');
8 if ('admin'.contains(value)) {}
Extract this magic string into a named variable or constant.
8 if ('admin'.contains(value)) {}
9 'a-b'.split('-');
Extract this magic string into a named variable or constant.
9 'a-b'.split('-');
10 value.contains(User(name: 'admin'));
Extract this magic string into a named variable or constant.
10 value.contains(User(name: 'admin'));
11 print(User(name: 'nested'));
Extract this magic string into a named variable or constant.
11 print(User(name: 'nested'));
12 final s = '${lookup("magic-key")}';

Valid

example.dartdart
import 'dart:core';
export 'dart:core';

const title = 'Title';
class Model { final label = 'Label'; }
void f(dynamic value, [String fallback = 'Fallback']) {
  final message = 'message';
  print('log');
  debugPrint('debug');
  assert(value != null, 'required');
  RegExp('pattern');
  Uri.https('example.com');
  StateError('error');
  ArgumentError.value(value, 'count', 'must be positive');
  RangeError.range(value, 0, 9, 'index');
  value.split(',');
  const map = {'key': 'value'};
  value['key'];
  consume('');
  value..['cascade-key'] = 1;
  value..['cascade-read'].toString();
  consume({'serialized-key': value});
  value.contains('direct');
  value.contains(('parenthesized'));
  print(message: 'named');
  final parenthesized = ('initializer');
  final interpolated = '${value}';
}

enum Env {
  dev('https://dev.example.com');
  const Env(this.url);
  final String url;
}

void patterns(dynamic value) {
  if (value case 'ready') {}
  switch (value) {
    case 'a':
      break;
    default:
      break;
  }
  final matched = switch (value) { 'b' => true, _ => false };
  if (value case {'user': var name}) {}
}

class Marker { const Marker(String label); }
@Marker('annotation')
void annotated() {}

Configure no-magic-string

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

falcon.jsonjson
{
  "linter": {
    "rules": {
      "suspicious": {
        "no-magic-string": "error"
      }
    }
  }
}

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

example.dartdart
// falcon-ignore lint/suspicious/no-magic-string: <reason>
  • no-self-comparisonsno_self_comparisonsrecommended

    Flags proven self-comparisons of side-effect-free scalar values.

  • no-wildcard-variable-usesno_wildcard_variable_usesrecommended

    Flags references to a wildcard variable or parameter (a name made solely of underscores, such as _ or __).

  • overridden-fieldsoverridden_fieldsrecommended

    Flags instance fields that redeclare an inherited field.

  • prefer-unique-test-namestest

    Reports duplicate test descriptions within a group and constant names in loops.

  • recursive-gettersrecursive_gettersrecommended

    Flags a getter that unconditionally returns itself.

  • unnecessary-null-aware-assignmentsunnecessary_null_aware_assignmentsrecommended

    Flags x ??= null, which can never have an effect.

  • unnecessary-null-in-if-null-operatorsunnecessary_null_in_if_null_operatorsrecommended

    Flags x ?? null and null ?? x, where the null operand is redundant.

  • use-rethrow-when-possibleuse_rethrow_when_possiblerecommended

    Flags throw e inside a catch (e) by matching the exception parameter's name.