prefer-read-for-methods

Path
lint/correctness/prefer-read-for-methods
Default
On (recommended)
Origin
Falcon
Domain
provider
Rule
396 of 512
recommendedprovider

Flags void method actions on a listening Provider lookup during build.

Use context.read or Provider.of(listen: false) for actions instead. Only resolved void methods in confirmed widget build/buildWithChild methods are checked; queries, property reads and unresolved values keep subscriptions. Widget helpers and didChangeDependencies are not assumed to run in build. Outside build, avoid-watch-outside-build owns the diagnostic.

Invalid

example.dartdart
import 'package:flutter/widgets.dart';
import 'package:provider/provider.dart';
import 'package:nested/nested.dart';

class Service {
  void save() {}
  void refresh() {}
  void reset() {}
}
class View extends StatelessWidget {
  Widget build(BuildContext context) {
    context.watch<Service>().save();
    context.watch<Service>().refresh();
    context.watch<Service>().reset();
    Provider.of<Service>(context).save();
    Provider.of<Service>(context, listen: true).refresh();
    return SizedBox();
  }
}

class SingleView extends SingleChildStatelessWidget {
  Widget buildWithChild(BuildContext context, Widget? child) {
    context.watch<Service>().save();
    Provider.of<Service>(context).refresh();
    return child ?? SizedBox();
  }
}

class SingleState extends SingleChildState<SingleChildStatefulWidget> {
  Widget buildWithChild(BuildContext context, Widget? child) {
    context.watch<Service>().save();
    Provider.of<Service>(context).refresh();
    return child ?? SizedBox();
  }
}
Use read instead of watch when invoking a provided method.
11 Widget build(BuildContext context) {
12 context.watch<Service>().save();
Use read instead of watch when invoking a provided method.
12 context.watch<Service>().save();
13 context.watch<Service>().refresh();
Use read instead of watch when invoking a provided method.
13 context.watch<Service>().refresh();
14 context.watch<Service>().reset();
Use read instead of watch when invoking a provided method.
14 context.watch<Service>().reset();
15 Provider.of<Service>(context).save();
Use read instead of watch when invoking a provided method.
15 Provider.of<Service>(context).save();
16 Provider.of<Service>(context, listen: true).refresh();
Use read instead of watch when invoking a provided method.
22 Widget buildWithChild(BuildContext context, Widget? child) {
23 context.watch<Service>().save();
Use read instead of watch when invoking a provided method.
23 context.watch<Service>().save();
24 Provider.of<Service>(context).refresh();
Use read instead of watch when invoking a provided method.
30 Widget buildWithChild(BuildContext context, Widget? child) {
31 context.watch<Service>().save();
Use read instead of watch when invoking a provided method.
31 context.watch<Service>().save();
32 Provider.of<Service>(context).refresh();

Valid

example.dartdart
import 'package:flutter/widgets.dart';
import 'package:provider/provider.dart';

class Service {
  int get value => 1;
  void save() {}
  int calculate() => 1;
}
void actions(BuildContext context) {
  context.read<Service>().save();
  Provider.of<Service>(context, listen: false).save();
  final value = context.watch<Service>().value;
  final method = context.watch<Service>().save;
  final instance = context.watch<Service>();
  context.watch<Unknown>().save();
}
class Unknown {}
class Other { Service watch() => Service(); }
void unrelated(Other context) { context.watch().save(); }
class View extends StatelessWidget {
  Widget build(BuildContext context) {
    final query = context.watch<Service>().calculate();
    final selected = context.select<Service, int>((value) => value.value).toString();
    return SizedBox();
  }
}

class DependentState extends State<StatefulWidget> {
  BuildContext get context => throw 0;
  void didChangeDependencies() {
    context.watch<Service>().save();
    Provider.of<Service>(context).save();
  }
  Widget helper(BuildContext context) {
    context.watch<Service>().save();
    Provider.of<Service>(context).save();
    return SizedBox();
  }
  Widget build(BuildContext context) => helper(context);
}

Configure prefer-read-for-methods

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

falcon.jsonjson
{
  "linter": {
    "rules": {
      "correctness": {
        "prefer-read-for-methods": "error"
      }
    }
  }
}

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

example.dartdart
// falcon-ignore lint/correctness/prefer-read-for-methods: <reason>