use-ref-read-synchronously

Path
lint/correctness/use-ref-read-synchronously
Default
On (recommended)
Origin
Falcon
Domain
riverpod
Rule
500 of 512
recommendedriverpod

Flags Riverpod WidgetRef.read calls after an async gap without a mounted guard.

A widget may be disposed while awaiting a future. Check Flutter mounted before reading a provider. Only resolved Riverpod WidgetRef receivers are checked; notifier references are handled by use-ref-and-state-synchronously. Nested function bodies form independent async boundaries.

Invalid

example.dartdart
import 'package:flutter_riverpod/flutter_riverpod.dart';
final provider = Object();
Future<void> pause() async {}
abstract class Example extends ConsumerState<Object> {
  Future<void> afterAwait() async {
    await pause();
    ref.read(provider);
  }
  Future<void> explicitThis() async {
    await pause();
    this.ref.read(provider);
  }
  Future<void> staleGuard() async {
    if (!mounted) return;
    await pause();
    ref.read(provider);
  }
  Future<void> branch(bool condition) async {
    if (condition) await pause();
    ref.read(provider);
  }
  Future<void> secondGap() async {
    await pause();
    if (!mounted) return;
    await pause();
    ref.read(provider);
  }
}
Future<void> parameter(WidgetRef ref) async {
  await pause();
  ref.read(provider);
}
Check that the widget is mounted before calling `ref.read` after an asynchronous gap.
6 await pause();
7 ref.read(provider);
Check that the widget is mounted before calling `ref.read` after an asynchronous gap.
10 await pause();
11 this.ref.read(provider);
Check that the widget is mounted before calling `ref.read` after an asynchronous gap.
15 await pause();
16 ref.read(provider);
Check that the widget is mounted before calling `ref.read` after an asynchronous gap.
19 if (condition) await pause();
20 ref.read(provider);
Check that the widget is mounted before calling `ref.read` after an asynchronous gap.
25 await pause();
26 ref.read(provider);
Check that the widget is mounted before calling `ref.read` after an asynchronous gap.
30 await pause();
31 ref.read(provider);

Valid

example.dartdart
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter/widgets.dart';
final provider = Object();
Future<void> pause() async {}
abstract class Example extends ConsumerState<Object> {
  Future<void> beforeAwait() async {
    ref.read(provider);
    await pause();
  }
  Future<void> guarded() async {
    await pause();
    if (mounted) ref.read(provider);
  }
  Future<void> earlyReturn() async {
    await pause();
    if (!mounted) return;
    ref.read(provider);
  }
  Future<void> nested() async {
    await pause();
    void callback() { ref.read(provider); }
    callback();
  }
  Future<void> contextGuard(BuildContext context) async {
    await pause();
    if (!context.mounted) return;
    ref.read(provider);
  }
}
class Unrelated {
  Object read(Object provider) => provider;
}
Future<void> unrelated(Unrelated ref) async {
  await pause();
  ref.read(provider);
}
abstract class Count extends Notifier<int> {
  Future<void> notifierHandledElsewhere() async {
    await pause();
    ref.read(provider);
  }
}

Configure use-ref-read-synchronously

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

falcon.jsonjson
{
  "linter": {
    "rules": {
      "correctness": {
        "use-ref-read-synchronously": "error"
      }
    }
  }
}

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

example.dartdart
// falcon-ignore lint/correctness/use-ref-read-synchronously: <reason>
  • use-setstate-synchronouslyrecommendedflutter

    Require a mounted check before calling setState after an async gap.

  • valid-regexpsvalid_regexpsrecommended

    Disallow statically known invalid dart:core regular expressions.

  • void-checksvoid_checksrecommended

    Don't pass or assign values to void (or FutureOr<void>) locations.

  • add-equatable-propsrecommendedequatable

    Flags concrete Equatable subclasses that do not declare an instance props property.

  • always-pass-global-keyflutter

    Keep GlobalKeys stable and pass owned State fields to widgets.

  • always-remove-listenerrecommendedflutter

    Requires Flutter Listenable registrations in State to be removed.

  • always-use-package-importsalways_use_package_imports

    Disallow relative imports in libraries under a package's lib/ directory.

  • avoid-assigning-to-static-field

    Flags instance methods writing resolved static fields, including compound assignments and increments.