Rules / Correctness / use-once-constructors-once-provider

use-once-constructors-once-provider

lint/correctness/use-once-constructors-once-provider
recommendedflutter
Same as use_once_constructors_once_provider · Pyramid Lint

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"
      }
    }
  }
}