prefer-use-memo
- Group
- Performance
- Path
lint/performance/prefer-use-memo- Default
- Off, opt in
- Origin
- Falcon
- Domain
- flutter_hooks
- Rule
- 418 of 512
Prefer memoizing freshly allocated collection values used as hook keys. Flutter Hooks compares individual keys with ==; Dart collection literals use identity equality, so allocating a key again invalidates the memo every build. Only direct non-const collection literals in an explicit dependency list of resolved useEffect/useMemoized/useCallback calls are checked. This deliberately does not guess whether arbitrary build computations are expensive or stable.
Invalid
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:flutter_hooks/flutter_hooks.dart' as hooks;
void example(int value) {
useEffect(() {}, [[value]]);
useMemoized(() => value, [{value}]);
useCallback(() {}, [{'value': value}]);
hooks.useMemoized(() => value, [(<int>[value])]);
hooks.useEffect(() {}, [<String, int>{'value': value}]);
}void example(int value) { useEffect(() {}, [[value]]); useEffect(() {}, [[value]]); useMemoized(() => value, [{value}]); useMemoized(() => value, [{value}]); useCallback(() {}, [{'value': value}]); useCallback(() {}, [{'value': value}]); hooks.useMemoized(() => value, [(<int>[value])]); hooks.useMemoized(() => value, [(<int>[value])]); hooks.useEffect(() {}, [<String, int>{'value': value}]);Valid
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:flutter_hooks/flutter_hooks.dart' as hooks;
void example(int value) {
useEffect(() {}, [value]);
useMemoized(() => value, [const [1]]);
useCallback(() {}, [const {1}]);
useEffect(() {}, [const {'value': 1}]);
useMemoized(() => value, const [[1], {2}, {'value': 3}]);
final memo = useMemoized(() => [value], [value]);
useEffect(() {}, [memo]);
void shadow(dynamic useEffect) { useEffect(() {}, [[value]]); }
void prefix(dynamic hooks) { hooks.useEffect(() {}, [[value]]); }
}
class Local {
dynamic useEffect(dynamic fn, dynamic keys) {}
void example() { useEffect(() {}, [[1]]); }
}Configure prefer-use-memo
Set its severity in falcon.json. See the configuration guide.
{
"linter": {
"rules": {
"performance": {
"prefer-use-memo": "error"
}
}
}
}Or silence one occurrence with a suppression comment; the reason is required.
// falcon-ignore lint/performance/prefer-use-memo: <reason>More performance rules
- prefer-using-list-viewflutter
Suggests considering
ListViewfor aSingleChildScrollViewcontaining a plain Flutter Column with at least two unconditional children in a list literal. - 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.