avoid-ref-read-inside-build

Path
lint/correctness/avoid-ref-read-inside-build
Default
On (recommended)
Origin
Falcon
Domain
riverpod
Rule
125 of 512
recommendedriverpod

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

example.dartdart
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);
}
Use `ref.watch` in build so provider changes rebuild the widget.
5 Object build(Object context, WidgetRef ref) {
6 final value = ref.read(countProvider);
Use `ref.watch` in build so provider changes rebuild the widget.
6 final value = ref.read(countProvider);
7 if (value > 0) { return ref.read(countProvider); }
Use `ref.watch` in build so provider changes rebuild the widget.
7 if (value > 0) { return ref.read(countProvider); }
8 return ref.read<int>(countProvider);
Use `ref.watch` in build so provider changes rebuild the widget.
11class Arrow extends ConsumerWidget {
12 Object build(Object context, WidgetRef reader) => reader.read(countProvider);
Use `ref.watch` in build so provider changes rebuild the widget.
14class ScreenState extends ConsumerState<Object> {
15 Object build(Object context) => ref.read(countProvider);
Use `ref.watch` in build so provider changes rebuild the widget.
16}
17Object consumer() => Consumer(builder: (context, ref, child) => ref.read(countProvider));
Use `ref.watch` in build so provider changes rebuild the widget.
18class HookScreen extends hooks.HookConsumerWidget {
19 Object build(Object context, hooks.WidgetRef ref) => ref.read(countProvider);

Valid

example.dartdart
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.

falcon.jsonjson
{
  "linter": {
    "rules": {
      "correctness": {
        "avoid-ref-read-inside-build": "error"
      }
    }
  }
}

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

example.dartdart
// falcon-ignore lint/correctness/avoid-ref-read-inside-build: <reason>