avoid-passing-build-context-to-blocs

Path
lint/suspicious/avoid-passing-build-context-to-blocs
Default
Off, opt in
Origin
Falcon
Domain
bloc
Rule
111 of 512
bloc

Keeps Flutter BuildContext arguments outside Bloc and Cubit APIs.

Invalid

example.dartdart
import 'package:flutter/widgets.dart' as f;
import 'support.dart';
import 'package:bloc/bloc.dart' as b;

class ConsumerCubit extends b.Cubit<int> {
  ConsumerCubit(Object dependency) : super(0);
}

class CustomContext implements f.BuildContext {
  bool get mounted => true;
}

typedef ConsumerAlias = Consumer;

class Event {
  Event(Object payload);
}
class ChildEvent extends Event {
  ChildEvent(Object payload) : super(payload);
}
class EventBloc extends b.Bloc<Event, int> {
  EventBloc() : super(0);
  void add(Event event) {}
}

void dependencies(f.BuildContext context, Consumer consumer, CustomContext custom) {
  Consumer(context);
  new Consumer(context);
  Consumer.named(dependency: context);
  ChildConsumer(context);
  ConsumerAlias(context);
  consumer.accept(context);
  ConsumerCubit(context);
  Consumer(custom);
  consumer..accept(context);
}

void eventPayload(f.BuildContext context, EventBloc bloc) {
  bloc.add(Event(context));
  final event = ChildEvent(context);
  bloc.add(event);
}

void importedEvents(f.BuildContext context, CounterBloc bloc) {
  bloc.add(CounterEvent(context));
}

class ImplicitConsumer extends b.Cubit<int> {
  ImplicitConsumer() : super(0);
  void accept(Object dependency) {}
  void dependencies(f.BuildContext context) {
    accept(context);
    this.accept(context);
  }
}

class InheritedConsumer extends ImplicitConsumer {
  void inherited(f.BuildContext context) {
    accept(context);
  }
}
Keep Flutter `BuildContext` out of `Bloc` and `Cubit` dependencies.
26void dependencies(f.BuildContext context, Consumer consumer, CustomContext custom) {
27 Consumer(context);
Keep Flutter `BuildContext` out of `Bloc` and `Cubit` dependencies.
27 Consumer(context);
28 new Consumer(context);
Keep Flutter `BuildContext` out of `Bloc` and `Cubit` dependencies.
28 new Consumer(context);
29 Consumer.named(dependency: context);
Keep Flutter `BuildContext` out of `Bloc` and `Cubit` dependencies.
29 Consumer.named(dependency: context);
30 ChildConsumer(context);
Keep Flutter `BuildContext` out of `Bloc` and `Cubit` dependencies.
30 ChildConsumer(context);
31 ConsumerAlias(context);
Keep Flutter `BuildContext` out of `Bloc` and `Cubit` dependencies.
31 ConsumerAlias(context);
32 consumer.accept(context);
Keep Flutter `BuildContext` out of `Bloc` and `Cubit` dependencies.
32 consumer.accept(context);
33 ConsumerCubit(context);
Keep Flutter `BuildContext` out of `Bloc` and `Cubit` dependencies.
33 ConsumerCubit(context);
34 Consumer(custom);
Keep Flutter `BuildContext` out of `Bloc` and `Cubit` dependencies.
34 Consumer(custom);
35 consumer..accept(context);
Keep Flutter `BuildContext` out of `Bloc` and `Cubit` dependencies.
38void eventPayload(f.BuildContext context, EventBloc bloc) {
39 bloc.add(Event(context));
Keep Flutter `BuildContext` out of `Bloc` and `Cubit` dependencies.
39 bloc.add(Event(context));
40 final event = ChildEvent(context);
Keep Flutter `BuildContext` out of `Bloc` and `Cubit` dependencies.
44void importedEvents(f.BuildContext context, CounterBloc bloc) {
45 bloc.add(CounterEvent(context));
Keep Flutter `BuildContext` out of `Bloc` and `Cubit` dependencies.
51 void dependencies(f.BuildContext context) {
52 accept(context);
Keep Flutter `BuildContext` out of `Bloc` and `Cubit` dependencies.
52 accept(context);
53 this.accept(context);
Keep Flutter `BuildContext` out of `Bloc` and `Cubit` dependencies.
58 void inherited(f.BuildContext context) {
59 accept(context);

Valid

example.dartdart
import 'package:flutter/widgets.dart' as flutter;
import 'support.dart' as real;

class BuildContext {}
class Bloc<E, S> {}
class LocalBloc extends Bloc<Object, int> {
  LocalBloc(Object dependency);
}

class LookupConsumer extends real.Consumer {
  LookupConsumer() : super(0);
  static LookupConsumer of(flutter.BuildContext context) => LookupConsumer();
}
class UnrelatedEvent {
  UnrelatedEvent(Object payload);
}

void boundaries(flutter.BuildContext context, real.Consumer consumer, dynamic unknown) {
  real.Consumer(BuildContext());
  real.Consumer(real.Repository(0));
  real.Consumer(unknown);
  real.Repository(context);
  real.View(context);
  LocalBloc(context);
  consumer.accept(context.mounted);
  consumer..accept(context.mounted);
  LookupConsumer.of(context);
  UnrelatedEvent(context);
  final Consumer = (Object dependency) => real.Repository(dependency);
  Consumer(context);
}

void accept(Object value) {}

class ShadowedConsumer extends real.Consumer {
  ShadowedConsumer() : super(0);
  void localVariable(flutter.BuildContext context) {
    final accept = (Object value) {};
    accept(context);
  }
  void localFunction(flutter.BuildContext context) {
    void accept(Object value) {}
    accept(context);
  }
  void parameter(flutter.BuildContext context, void Function(Object) accept) {
    accept(context);
  }
  void libraryFunction(flutter.BuildContext context) {
    accept(context);
  }
  static void helper(Object value) {}
  void staticFunction(flutter.BuildContext context) {
    helper(context);
  }
}

Configure avoid-passing-build-context-to-blocs

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

falcon.jsonjson
{
  "linter": {
    "rules": {
      "suspicious": {
        "avoid-passing-build-context-to-blocs": "error"
      }
    }
  }
}

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

example.dartdart
// falcon-ignore lint/suspicious/avoid-passing-build-context-to-blocs: <reason>