avoid-recursive-widget-calls
- Group
- Correctness
- Path
lint/correctness/avoid-recursive-widget-calls- Default
- On (recommended)
- Origin
- Falcon
- Domain
- flutter
- Rule
- 119 of 512
Warns when a widget's build method constructs the same widget again.
Resolved Flutter StatelessWidget subclasses and State
Invalid
import 'package:flutter/material.dart';
class A extends StatelessWidget { Widget build(BuildContext context) => A(); }
class B extends StatelessWidget { Widget build(BuildContext context) => new B(); }
class C extends StatelessWidget { Widget build(BuildContext context) => Container(child: C()); }
class D extends StatefulWidget { State<D> createState() => DState(); }
class DState extends State<D> { Widget build(BuildContext context) => D(); }
class E extends StatelessWidget { E.named(); Widget build(BuildContext context) => E.named(); }import 'package:flutter/material.dart';class A extends StatelessWidget { Widget build(BuildContext context) => A(); }class A extends StatelessWidget { Widget build(BuildContext context) => A(); }class B extends StatelessWidget { Widget build(BuildContext context) => new B(); }class B extends StatelessWidget { Widget build(BuildContext context) => new B(); }class C extends StatelessWidget { Widget build(BuildContext context) => Container(child: C()); }class D extends StatefulWidget { State<D> createState() => DState(); }class DState extends State<D> { Widget build(BuildContext context) => D(); }class DState extends State<D> { Widget build(BuildContext context) => D(); }class E extends StatelessWidget { E.named(); Widget build(BuildContext context) => E.named(); }Valid
import 'package:flutter/material.dart';
class A extends StatelessWidget {
Widget build(BuildContext context) => Container();
A copy() => A();
}
class B extends StatelessWidget { Widget build(BuildContext context) => A(); }
class C extends StatefulWidget { State<C> createState() => CState(); }
class CState extends State<C> { Widget build(BuildContext context) => A(); }
class Other { Object build() => Other(); }
Object create() => A();
class Tree extends StatelessWidget {
Widget build(BuildContext context) => Builder(builder: (_) => Tree());
}
class Nested extends StatelessWidget {
final int depth = 0;
Widget build(BuildContext context) {
if (depth > 0) return Nested();
return Container();
}
}
class Forest extends StatelessWidget {
final List<int> children = [];
Widget build(BuildContext context) => Column(children: [
for (final child in children) Forest(),
]);
}
class Shadow extends StatelessWidget {
Widget build(BuildContext context) {
final Shadow = () => Container();
return Shadow();
}
}Configure avoid-recursive-widget-calls
Set its severity in falcon.json. See the configuration guide.
{
"linter": {
"rules": {
"correctness": {
"avoid-recursive-widget-calls": "error"
}
}
}
}Or silence one occurrence with a suppression comment; the reason is required.
// falcon-ignore lint/correctness/avoid-recursive-widget-calls: <reason>More correctness rules
- avoid-ref-inside-state-disposeriverpod
Rejects Riverpod widget references used during State.dispose.
- avoid-ref-read-inside-buildrecommendedriverpod
Flags one-time Riverpod reads of provider state during widget build.
- avoid-ref-watch-outside-buildrecommendedriverpod
Flags Riverpod WidgetRef.watch subscriptions outside synchronous widget build bodies.
- avoid-relative-lib-imports
avoid_relative_lib_importsrecommendedDisallow relative imports that reach into a
lib/directory. - avoid-returning-widgets
avoid-returning-widgetsflutterDisallow functions and methods that return a
Widget. - avoid-type-to-string
avoid_type_to_stringrecommendedAvoid
Type.toString()in production code, where type names may be minified. - avoid-uncaught-future-errorsrecommended
Flags local futures first awaited after another await inside a try/catch.
- avoid-unconditional-break
Reports unconditional break, continue, return or throw in a for-loop body.