avoid-ref-read-inside-build
- Group
- Correctness
- Path
lint/correctness/avoid-ref-read-inside-build- Default
- On (recommended)
- Origin
- Falcon
- Domain
- riverpod
- Rule
- 125 of 512
Flags one-time Riverpod reads of provider state during widget build.
Use watch to rebuild when state changes. Nested callbacks and notifier action reads are excluded.
Invalid
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart' as hooks;
final countProvider = Provider<int>((ref) => 0);
class Screen extends ConsumerWidget {
Object build(Object context, WidgetRef ref) {
final value = ref.read(countProvider);
if (value > 0) { return ref.read(countProvider); }
return ref.read<int>(countProvider);
}
}
class Arrow extends ConsumerWidget {
Object build(Object context, WidgetRef reader) => reader.read(countProvider);
}
class ScreenState extends ConsumerState<Object> {
Object build(Object context) => ref.read(countProvider);
}
Object consumer() => Consumer(builder: (context, ref, child) => ref.read(countProvider));
class HookScreen extends hooks.HookConsumerWidget {
Object build(Object context, hooks.WidgetRef ref) => ref.read(countProvider);
} Object build(Object context, WidgetRef ref) { final value = ref.read(countProvider); final value = ref.read(countProvider); if (value > 0) { return ref.read(countProvider); } if (value > 0) { return ref.read(countProvider); } return ref.read<int>(countProvider);class Arrow extends ConsumerWidget { Object build(Object context, WidgetRef reader) => reader.read(countProvider);class ScreenState extends ConsumerState<Object> { Object build(Object context) => ref.read(countProvider);}Object consumer() => Consumer(builder: (context, ref, child) => ref.read(countProvider));class HookScreen extends hooks.HookConsumerWidget { Object build(Object context, hooks.WidgetRef ref) => ref.read(countProvider);Valid
import 'package:flutter/widgets.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart' as hooks;
final countProvider = Provider<int>((ref) => 0);
class Screen extends ConsumerWidget {
Object build(Object context, WidgetRef ref) {
final callback = () => ref.read(countProvider);
void local() { ref.read(countProvider); }
return ref.watch(countProvider);
}
int action(WidgetRef ref) => ref.read(countProvider);
}
int outside(WidgetRef ref) => ref.read(countProvider);
final plain = Provider<int>((ref) => ref.read(countProvider));
class Unrelated {
int read(Object value) => 0;
Object build(Object context, Unrelated ref) => ref.read(countProvider);
}
Object consumer() => Consumer(builder: (context, ref, child) => () => ref.read(countProvider));
class DeferredMenu extends ConsumerWidget {
Object build(Object context, WidgetRef ref) =>
PopupMenuButton(itemBuilder: (context) => ref.read(countProvider));
}Configure avoid-ref-read-inside-build
Set its severity in falcon.json. See the configuration guide.
{
"linter": {
"rules": {
"correctness": {
"avoid-ref-read-inside-build": "error"
}
}
}
}Or silence one occurrence with a suppression comment; the reason is required.
// falcon-ignore lint/correctness/avoid-ref-read-inside-build: <reason>More correctness rules
- 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.
- avoid-undisposed-instancesrecommendedflutter
Warns when a disposable constructor result is discarded.
- avoid-unmodified-loop-conditionrecommended
Flags loop conditions whose local scalar inputs are never modified by the loop.