avoid-shrink-wrap-in-lists

Path
lint/performance/avoid-shrink-wrap-in-lists
Default
Off, opt in
Origin
Falcon
Domain
flutter
Rule
139 of 512
flutter

Avoids shrink-wrapped Flutter lists nested in rows, columns, or other lists.

Shrink wrapping repeatedly measures the list's contents; prefer slivers instead. Only resolved Flutter ListView constructors with a literal true shrinkWrap argument inside a Flutter Row, Column, or ListView child argument are flagged. Unknown flags, false values, unrelated classes, and standalone lists are ignored.

Invalid

example.dartdart
import 'package:flutter/material.dart';
import 'package:flutter/material.dart' as m;

Widget column() => Column(children: [
  ListView(shrinkWrap: true),
]);
Widget row() => Row(children: [
  new ListView(shrinkWrap: true),
]);
Widget prefixed() => m.Column(children: [
  m.ListView(shrinkWrap: (true)),
]);
Widget nested() => ListView(children: [
  ListView.builder(shrinkWrap: true, itemBuilder: (context, index) => Text('item')),
]);
Widget wrapped() => Column(children: [
  Expanded(child: ListView(shrinkWrap: true)),
]);
Avoid shrink wrapping a nested list; use slivers instead.
4Widget column() => Column(children: [
5 ListView(shrinkWrap: true),
Avoid shrink wrapping a nested list; use slivers instead.
7Widget row() => Row(children: [
8 new ListView(shrinkWrap: true),
Avoid shrink wrapping a nested list; use slivers instead.
10Widget prefixed() => m.Column(children: [
11 m.ListView(shrinkWrap: (true)),
Avoid shrink wrapping a nested list; use slivers instead.
13Widget nested() => ListView(children: [
14 ListView.builder(shrinkWrap: true, itemBuilder: (context, index) => Text('item')),
Avoid shrink wrapping a nested list; use slivers instead.
16Widget wrapped() => Column(children: [
17 Expanded(child: ListView(shrinkWrap: true)),

Valid

example.dartdart
import 'package:flutter/material.dart';
import 'package:flutter/material.dart' as m;

Widget standalone() => ListView(shrinkWrap: true);
Widget falseFlag() => Column(children: [ListView(shrinkWrap: false)]);
Widget unknownFlag(bool flag) => Column(children: [ListView(shrinkWrap: flag)]);
Widget noFlag() => Row(children: [ListView()]);
Widget unrelatedParent() => Center(child: ListView(shrinkWrap: true));
Widget localShadow(dynamic ListView) => Column(children: [ListView(shrinkWrap: true)]);
Widget prefixShadow(dynamic m) => Column(children: [m.ListView(shrinkWrap: true)]);
Widget deferred() => Column(children: [Builder(builder: (context) => ListView(shrinkWrap: true))]);

Configure avoid-shrink-wrap-in-lists

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

falcon.jsonjson
{
  "linter": {
    "rules": {
      "performance": {
        "avoid-shrink-wrap-in-lists": "error"
      }
    }
  }
}

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

example.dartdart
// falcon-ignore lint/performance/avoid-shrink-wrap-in-lists: <reason>