Rules / Correctness / use-once-constructors-once-provider
use-once-constructors-once-provider
Require Riverpod once-providers to be created through .once().
Flags a direct invocation of OnceProvider, FutureProvider, or
StateProvider — for example OnceProvider(...) — where the .once()
factory should be used instead. The .once() form constructs the provider's
value a single time rather than rebuilding it on each read, which is the
intended lifecycle for these providers; calling the constructor directly
opts out of it. Calls already written as Provider.once(...) are accepted,
and explicit new/const constructions are left alone.
Invalid
example.dartdart
import 'package:riverpod/riverpod.dart';
// Bad: OnceProvider without .once() factory
class MyService {
String getName() => 'service';
}
final serviceProvider = OnceProvider(
(ref) => MyService(),
);
final anotherProvider = OnceProvider<String>(
(ref) => 'value',
);
final badPattern = OnceProvider(
create: (ref) => MyService(),
);
final futureProvider = FutureProvider(
(ref) async => 'async value',
);
final stateProvider = StateProvider(
(ref) => 42,
);
OnceProvider and similar Riverpod providers should use .once() factory method
8
9final serviceProvider = OnceProvider(
∙
OnceProvider and similar Riverpod providers should use .once() factory method
12
13final anotherProvider = OnceProvider<String>(
∙
OnceProvider and similar Riverpod providers should use .once() factory method
16
17final badPattern = OnceProvider(
∙
OnceProvider and similar Riverpod providers should use .once() factory method
20
21final futureProvider = FutureProvider(
∙
OnceProvider and similar Riverpod providers should use .once() factory method
24
25final stateProvider = StateProvider(
∙
Valid
example.dartdart
import 'package:riverpod/riverpod.dart';
// Good: OnceProvider with .once() factory
class MyService {
String getName() => 'service';
}
final serviceProvider = OnceProvider.once(
(ref) => MyService(),
);
final anotherProvider = OnceProvider<String>.once(
(ref) => 'value',
);
final goodPattern = OnceProvider.once(
create: (ref) => MyService(),
);
final futureProvider = FutureProvider.once(
(ref) async => 'async value',
);
final stateProvider = StateProvider.once(
(ref) => 0,
);
// Regular providers (not OnceProvider-related) are fine
final regularProvider = Provider(
(ref) => 'regular',
);
// OnceProvider variants with .once()
final withTypeParam = OnceProvider<MyService>.once(
(ref) => MyService(),
);
// Different provider type entirely
final changeNotifierProvider = ChangeNotifierProvider(
(ref) => MyChangeNotifier(),
);
How to configure
Set the severity of use-once-constructors-once-provider in your falcon.json:
falcon.jsonjson
{
"linter": {
"rules": {
"correctness": {
"use-once-constructors-once-provider": "error"
}
}
}
}