prefer-using-list-view
- Group
- Performance
- Path
lint/performance/prefer-using-list-view- Default
- Off, opt in
- Origin
- Falcon
- Domain
- flutter
- Rule
- 419 of 512
Suggests considering ListView for a SingleChildScrollView containing a plain
Flutter Column with at least two unconditional children in a list literal.
Spreads, control-flow elements and dynamic lists do not establish that minimum.
This is not a layout-neutral replacement: preserve the
Column's child alignment and scroll view's padding explicitly. ListView
stretches children across the cross axis and adds MediaQuery padding by default.
For the default Column alignment, wrap each list child in an Align with
Alignment.topCenter; use the original scroll padding, or EdgeInsets.zero
when none was supplied. Review constraints and child lifecycle separately.
No automatic fix is offered.
Invalid
import 'package:flutter/widgets.dart';
import 'package:flutter/widgets.dart' as f;
typedef V = SingleChildScrollView;
void callback() {}
void examples(Widget child, dynamic image, dynamic color, double size, String label) {
SingleChildScrollView(child: Column(children: [child, child]));
const SingleChildScrollView(child: Column(children: [Text('a'), Text('b')]));
new SingleChildScrollView(child: Column(children: [child, child]));
f.SingleChildScrollView(child: f.Column(children: [child, child]));
V(child: Column(children: [child, child]));
SingleChildScrollView(child: Column(children: [Text('a'), Text('much longer')]));
SingleChildScrollView(child: Column(children: ([child, child])));
SingleChildScrollView(child: Column(children: [child, ...<Widget>[], child]));
SingleChildScrollView(child: Column(children: [child, if (size > 0) child, child]));
SingleChildScrollView(child: Column(children: [child, for (final item in <Widget>[]) item, child]));
SingleChildScrollView(child: Column(children: <Widget>[child, child]));
}void examples(Widget child, dynamic image, dynamic color, double size, String label) { SingleChildScrollView(child: Column(children: [child, child])); SingleChildScrollView(child: Column(children: [child, child])); const SingleChildScrollView(child: Column(children: [Text('a'), Text('b')])); const SingleChildScrollView(child: Column(children: [Text('a'), Text('b')])); new SingleChildScrollView(child: Column(children: [child, child])); new SingleChildScrollView(child: Column(children: [child, child])); f.SingleChildScrollView(child: f.Column(children: [child, child])); f.SingleChildScrollView(child: f.Column(children: [child, child])); V(child: Column(children: [child, child])); V(child: Column(children: [child, child])); SingleChildScrollView(child: Column(children: [Text('a'), Text('much longer')])); SingleChildScrollView(child: Column(children: [Text('a'), Text('much longer')])); SingleChildScrollView(child: Column(children: ([child, child]))); SingleChildScrollView(child: Column(children: ([child, child]))); SingleChildScrollView(child: Column(children: [child, ...<Widget>[], child])); SingleChildScrollView(child: Column(children: [child, ...<Widget>[], child])); SingleChildScrollView(child: Column(children: [child, if (size > 0) child, child])); SingleChildScrollView(child: Column(children: [child, if (size > 0) child, child])); SingleChildScrollView(child: Column(children: [child, for (final item in <Widget>[]) item, child])); SingleChildScrollView(child: Column(children: [child, for (final item in <Widget>[]) item, child])); SingleChildScrollView(child: Column(children: <Widget>[child, child]));Valid
import 'package:flutter/widgets.dart';
import 'package:flutter/widgets.dart' as f;
typedef V = SingleChildScrollView;
void callback() {}
void examples(Widget child, dynamic image, dynamic color, double size, String label) {
ListView(children: [child]);
SingleChildScrollView(child: Row());
SingleChildScrollView(child: child);
Column(children: [child]);
SingleChildScrollView();
SingleChildScrollView(child: Column());
const SingleChildScrollView(child: Column(children: []));
new SingleChildScrollView(child: Column(children: [child]));
f.SingleChildScrollView(child: f.Column(children: <Widget>[]));
V(child: Column(children: [child]));
SingleChildScrollView(child: Column(children: ([child])));
SingleChildScrollView(child: Column(children: <Widget>[child]));
SingleChildScrollView(child: Column(children: [...<Widget>[]]));
SingleChildScrollView(child: Column(children: [...<Widget>[child]]));
SingleChildScrollView(child: Column(children: [if (size > 0) child]));
SingleChildScrollView(child: Column(children: [if (size > 0) child else child]));
SingleChildScrollView(child: Column(children: [for (final item in <Widget>[]) item]));
SingleChildScrollView(child: Column(children: [child, ...<Widget>[]]));
SingleChildScrollView(child: Column(children: [child, if (size > 0) child]));
SingleChildScrollView(child: Column(children: image));
SingleChildScrollView(child: Column(children: image ? <Widget>[] : <Widget>[child]));
SingleChildScrollView(child: Column(children: [child, ...image]));
SingleChildScrollView(child: Column(children: [child, ...?image]));
SingleChildScrollView(child: Column(children: [child, ?image]));
SingleChildScrollView(child: Column(children: [for (final item in <Widget>[]) item, child]));
}Configure prefer-using-list-view
Set its severity in falcon.json. See the configuration guide.
{
"linter": {
"rules": {
"performance": {
"prefer-using-list-view": "error"
}
}
}
}Or silence one occurrence with a suppression comment; the reason is required.
// falcon-ignore lint/performance/prefer-using-list-view: <reason>More performance rules
- sized-box-for-whitespace
sized_box_for_whitespacerecommendedflutterFlags a
Containerused only to add fixedwidth/heightwhitespace. - unnecessary-to-list-in-spreads
unnecessary_to_list_in_spreadsrecommendedFlags a
.toList()call on the operand of a spread, e.g. - use-is-even-rather-than-modulo
use_is_even_rather_than_moduloPrefers
isEven/isOddto comparingx % 2with0or1. - use-string-buffers
use_string_buffersrecommendedPrefers a
StringBufferto growing aStringwith+inside a loop. - avoid-border-allflutter
Avoids Flutter's non-const
Border.allfactory. - avoid-shrink-wrap-in-listsflutter
Avoids shrink-wrapped Flutter lists nested in rows, columns, or other lists.
- avoid-slow-async-io
avoid_slow_async_ioAvoid the slow asynchronous
dart:iofile-system queries. - avoid-slow-collection-methods
Reports filtered iterable searches that have a direct search-method alternative.