dispose-provided-instances
- Group
- Correctness
- Path
lint/correctness/dispose-provided-instances- Default
- On (recommended)
- Origin
- Falcon
- Domain
- riverpod
- Rule
- 223 of 512
Flags provider-created instances with a dispose method that lack ref.onDispose cleanup.
Riverpod autoDispose destroys provider state, not arbitrary disposable objects. Register each owned instance's dispose method with the provider's ref.onDispose. Only package-confirmed Provider/FutureProvider/StreamProvider callbacks and resolved constructor-created resources are checked. Nested deferred closures, borrowed values, unknown types, and types without a recognized release method are excluded. Direct cleanup and named local callbacks are recognized; opaque cleanup calls mentioning the resource conservatively count as registration. Borrowed factory returns are recognized only when their simple body is visible in this file; constructor metadata does not expose bodies from other libraries.
Invalid
import 'package:riverpod/riverpod.dart';
class Service {
Service();
Service.named();
void dispose() {}
}
class Child extends Service {}
final plain = Provider((ref) {
final service = Service();
return service;
});
final automatic = Provider.autoDispose((ref) {
final service = Service();
return service;
});
final arrow = Provider((ref) => Service());
final explicitNew = Provider((ref) {
final service = new Service();
return service;
});
final named = Provider((ref) {
final service = Service.named();
return service;
});
final inherited = Provider((ref) {
final service = Child();
return service;
});
final wrongInstance = Provider((ref) {
final owned = Service();
ref.onDispose(() {});
return owned;
});
final mereMention = Provider((ref) {
final service = Service();
ref.onDispose(() { service.dispose; });
return service;
});
final deferred = Provider((ref) {
final service = Service();
ref.onDispose(() { final later = () => service.dispose(); });
return service;
});final plain = Provider((ref) { final service = Service();final automatic = Provider.autoDispose((ref) { final service = Service();});final arrow = Provider((ref) => Service());final explicitNew = Provider((ref) { final service = new Service();final named = Provider((ref) { final service = Service.named();final inherited = Provider((ref) { final service = Child();final wrongInstance = Provider((ref) { final owned = Service();final mereMention = Provider((ref) { final service = Service();final deferred = Provider((ref) { final service = Service();Valid
import 'package:riverpod/riverpod.dart';
class Service { Service(); void dispose() {} }
class Value { Value(); }
final shared = Service();
final tearOff = Provider((ref) {
final service = Service();
ref.onDispose(service.dispose);
return service;
});
final arrowCleanup = Provider((ref) {
final service = Service();
ref.onDispose(() => service.dispose());
return service;
});
final blockCleanup = Provider.autoDispose((ref) {
final service = Service();
ref.onDispose(() { service.dispose(); });
return service;
});
final borrowed = Provider((ref) => shared);
final immutable = Provider((ref) => Value());
final deferred = Provider((ref) => () => Service());
final twoInstances = Provider((ref) {
final first = Service();
final second = Service();
ref.onDispose(first.dispose);
ref.onDispose(() { second.dispose(); });
return first;
});
Service outsideProvider() => Service();
void ordinaryCallback(Object Function(Ref) callback) {}
void unrelatedApi() { ordinaryCallback((ref) => Service()); }Configure dispose-provided-instances
Set its severity in falcon.json. See the configuration guide.
{
"linter": {
"rules": {
"correctness": {
"dispose-provided-instances": "error"
}
}
}
}Or silence one occurrence with a suppression comment; the reason is required.
// falcon-ignore lint/correctness/dispose-provided-instances: <reason>More correctness rules
- dispose-provider-resourcesrecommendedriverpod
Flags provider-created resources without autoDispose or ref.onDispose cleanup.
- dispose-providersrecommendedprovider
Requires cleanup callbacks for disposable values created by package:provider's Provider.
- emit-new-bloc-state-instancesrecommendedbloc
Flags Bloc and Cubit emissions that reuse their current state instance.
- exhaustive-cases
exhaustive_casesrecommendedRequire switch statements over enum-like classes to cover every constant value.
- function-always-returns-null
Flags value functions with a proven explicit null return on every path.
- function-always-returns-same-value
Warns when distinct return paths in a function produce the same scalar constant.
- handle-bloc-event-subclassesbloc
Warns when a Bloc constructor leaves a concrete event subclass without a handler.
- hash-and-equals
hash_and_equalsrecommendedRequire
hashCodeand==to be overridden together.