prefer-single-setstate

Path
lint/performance/prefer-single-setstate
Default
Off, opt in
Origin
Falcon
Domain
flutter
Rule
406 of 512
flutter

Merge consecutive Flutter State.setState statements in the same block. Intervening statements and control-flow boundaries are not collapsible runs.

Invalid

example.dartdart
import 'package:flutter/material.dart' as f;
class S extends f.State<f.StatefulWidget> {
  int value = 0;
  void update() {
    setState(() { value++; });
    setState(() { value++; });
    this.setState(() { value++; });
    value++;
    this.setState(() { value++; });
    (setState(() { value++; }));
    if (mounted) {
      setState(() => value++);
      setState(() => value++);
    }
    void nested() {
      setState(() { value++; });
      setState(() { value++; });
    }
  }
}
class Child extends S {
  void inherited() {
    setState(() { value++; });
    setState(() { value++; });
  }
}
Merge this `setState` callback into the preceding `setState` call.
5 setState(() { value++; });
6 setState(() { value++; });
Merge this `setState` callback into the preceding `setState` call.
6 setState(() { value++; });
7 this.setState(() { value++; });
Merge this `setState` callback into the preceding `setState` call.
9 this.setState(() { value++; });
10 (setState(() { value++; }));
Merge this `setState` callback into the preceding `setState` call.
12 setState(() => value++);
13 setState(() => value++);
Merge this `setState` callback into the preceding `setState` call.
16 setState(() { value++; });
17 setState(() { value++; });
Merge this `setState` callback into the preceding `setState` call.
23 setState(() { value++; });
24 setState(() { value++; });

Valid

example.dartdart
import 'package:flutter/material.dart';
class S extends State<StatefulWidget> {
  int value = 0;
  void update() {
    setState(() { value++; value++; });
    value++;
    setState(() { value++; });
    if (mounted) setState(() { value++; });
    else setState(() { value--; });
    { setState(() { value++; }); }
    { setState(() { value++; }); }
  }
  void shadow() {
    void setState(void Function() callback) { callback(); }
    setState(() { value++; });
    setState(() { value++; });
  }
}
class Fake {
  void setState(void Function() callback) { callback(); }
  void update() { setState(() {}); setState(() {}); }
}
class Override extends S {
  void setState(void Function() callback) { callback(); }
  void update() { setState(() {}); setState(() {}); }
}

Configure prefer-single-setstate

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

falcon.jsonjson
{
  "linter": {
    "rules": {
      "performance": {
        "prefer-single-setstate": "error"
      }
    }
  }
}

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

example.dartdart
// falcon-ignore lint/performance/prefer-single-setstate: <reason>
  • prefer-use-callbackflutter_hooks

    Prefer useCallback for synchronous memoized function literals.

  • prefer-use-memoflutter_hooks

    Prefer memoizing freshly allocated collection values used as hook keys.

  • prefer-using-list-viewflutter

    Suggests considering ListView for a SingleChildScrollView containing a plain Flutter Column with at least two unconditional children in a list literal.

  • sized-box-for-whitespacesized_box_for_whitespacerecommendedflutter

    Flags a Container used only to add fixed width/height whitespace.

  • unnecessary-to-list-in-spreadsunnecessary_to_list_in_spreadsrecommended

    Flags a .toList() call on the operand of a spread, e.g.

  • use-is-even-rather-than-modulouse_is_even_rather_than_modulo

    Prefers isEven/isOdd to comparing x % 2 with 0 or 1.

  • use-string-buffersuse_string_buffersrecommended

    Prefers a StringBuffer to growing a String with + inside a loop.

  • avoid-border-allflutter

    Avoids Flutter's non-const Border.all factory.