use-ref-read-synchronously
- Group
- Correctness
- Path
lint/correctness/use-ref-read-synchronously- Default
- On (recommended)
- Origin
- Falcon
- Domain
- riverpod
- Rule
- 500 of 512
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
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);
} await pause(); ref.read(provider); await pause(); this.ref.read(provider); await pause(); ref.read(provider); if (condition) await pause(); ref.read(provider); await pause(); ref.read(provider); await pause(); ref.read(provider);Valid
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.
{
"linter": {
"rules": {
"correctness": {
"use-ref-read-synchronously": "error"
}
}
}
}Or silence one occurrence with a suppression comment; the reason is required.
// falcon-ignore lint/correctness/use-ref-read-synchronously: <reason>More correctness rules
- use-setstate-synchronouslyrecommendedflutter
Require a mounted check before calling setState after an async gap.
- valid-regexps
valid_regexpsrecommendedDisallow statically known invalid
dart:coreregular expressions. - void-checks
void_checksrecommendedDon't pass or assign values to
void(orFutureOr<void>) locations. - add-equatable-propsrecommendedequatable
Flags concrete Equatable subclasses that do not declare an instance props property.
- always-pass-global-keyflutter
Keep
GlobalKeysstable and pass owned State fields to widgets. - always-remove-listenerrecommendedflutter
Requires Flutter Listenable registrations in State to be removed.
- always-use-package-imports
always_use_package_importsDisallow 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.