prefer-multi-provider

Group
Style
Path
lint/style/prefer-multi-provider
Default
Off, opt in
Origin
Falcon
Domain
provider
Rule
388 of 512
provider

Prefer a flat MultiProvider to directly nested provider widgets.

Invalid

example.dartdart
import 'package:provider/provider.dart' as p;
void examples(Object existing) {
  p.Provider(create: (_) => 1, child: p.Provider(create: (_) => 2));
  p.Provider.value(value: existing, child: p.ChangeNotifierProvider.value(value: existing));
  p.ChangeNotifierProvider(create: (_) => existing, child: p.ListenableProvider.value(value: existing));
  new p.ListenableProvider(create: (_) => existing, child: new p.Provider(create: (_) => 1));
  p.Provider<int>(create: (_) => 1, child: (p.Provider<String>(create: (_) => 'a')));
  p.Provider<Object>.value(value: existing, child: p.ChangeNotifierProvider<Object>.value(value: existing));
  p.ProxyProvider0<Object>(update: (_, previous) => existing, child: p.Provider.value(value: existing));
  p.Provider.value(value: existing, child: p.ProxyProvider0<Object>(update: (_, previous) => existing));
  p.ChangeNotifierProxyProvider0<Object>(update: (_, previous) => existing, child: p.Provider.value(value: existing));
  p.Provider.value(value: existing, child: p.ChangeNotifierProxyProvider0<Object>(update: (_, previous) => existing));
  p.ListenableProxyProvider0<Object>(update: (_, previous) => existing, child: p.Provider.value(value: existing));
  p.Provider.value(value: existing, child: p.ListenableProxyProvider0<Object>(update: (_, previous) => existing));
}
Replace directly nested providers with `MultiProvider`.
2void examples(Object existing) {
3 p.Provider(create: (_) => 1, child: p.Provider(create: (_) => 2));
Replace directly nested providers with `MultiProvider`.
3 p.Provider(create: (_) => 1, child: p.Provider(create: (_) => 2));
4 p.Provider.value(value: existing, child: p.ChangeNotifierProvider.value(value: existing));
Replace directly nested providers with `MultiProvider`.
4 p.Provider.value(value: existing, child: p.ChangeNotifierProvider.value(value: existing));
5 p.ChangeNotifierProvider(create: (_) => existing, child: p.ListenableProvider.value(value: existing));
Replace directly nested providers with `MultiProvider`.
5 p.ChangeNotifierProvider(create: (_) => existing, child: p.ListenableProvider.value(value: existing));
6 new p.ListenableProvider(create: (_) => existing, child: new p.Provider(create: (_) => 1));
Replace directly nested providers with `MultiProvider`.
6 new p.ListenableProvider(create: (_) => existing, child: new p.Provider(create: (_) => 1));
7 p.Provider<int>(create: (_) => 1, child: (p.Provider<String>(create: (_) => 'a')));
Replace directly nested providers with `MultiProvider`.
7 p.Provider<int>(create: (_) => 1, child: (p.Provider<String>(create: (_) => 'a')));
8 p.Provider<Object>.value(value: existing, child: p.ChangeNotifierProvider<Object>.value(value: existing));
Replace directly nested providers with `MultiProvider`.
8 p.Provider<Object>.value(value: existing, child: p.ChangeNotifierProvider<Object>.value(value: existing));
9 p.ProxyProvider0<Object>(update: (_, previous) => existing, child: p.Provider.value(value: existing));
Replace directly nested providers with `MultiProvider`.
9 p.ProxyProvider0<Object>(update: (_, previous) => existing, child: p.Provider.value(value: existing));
10 p.Provider.value(value: existing, child: p.ProxyProvider0<Object>(update: (_, previous) => existing));
Replace directly nested providers with `MultiProvider`.
10 p.Provider.value(value: existing, child: p.ProxyProvider0<Object>(update: (_, previous) => existing));
11 p.ChangeNotifierProxyProvider0<Object>(update: (_, previous) => existing, child: p.Provider.value(value: existing));
Replace directly nested providers with `MultiProvider`.
11 p.ChangeNotifierProxyProvider0<Object>(update: (_, previous) => existing, child: p.Provider.value(value: existing));
12 p.Provider.value(value: existing, child: p.ChangeNotifierProxyProvider0<Object>(update: (_, previous) => existing));
Replace directly nested providers with `MultiProvider`.
12 p.Provider.value(value: existing, child: p.ChangeNotifierProxyProvider0<Object>(update: (_, previous) => existing));
13 p.ListenableProxyProvider0<Object>(update: (_, previous) => existing, child: p.Provider.value(value: existing));
Replace directly nested providers with `MultiProvider`.
13 p.ListenableProxyProvider0<Object>(update: (_, previous) => existing, child: p.Provider.value(value: existing));
14 p.Provider.value(value: existing, child: p.ListenableProxyProvider0<Object>(update: (_, previous) => existing));

Valid

example.dartdart
import 'package:flutter/widgets.dart';
import 'package:provider/provider.dart' as p;
class Provider { Provider({Object? child}); }
class Wrapper { Wrapper({Object? child}); }
void examples(Object existing, Object child) {
  p.Provider(create: (_) => 1);
  p.Provider.value(value: existing, child: child);
  p.MultiProvider(providers: [p.Provider(create: (_) => 1), p.Provider(create: (_) => 2)], child: child);
  p.Provider(create: (_) => 1, child: Wrapper(child: p.Provider(create: (_) => 2)));
  Provider(child: p.Provider(create: (_) => 1));
  p.Provider(create: (_) => 1, child: Provider(child: child));
  p.Provider(create: (_) => 1, child: p.MultiProvider(providers: [], child: child));
}
void shadowed(dynamic p) {
  p.Provider(child: p.Provider());
}
void lookupChild(BuildContext context) {
  p.Provider(create: (_) => 1, child: p.Provider.of<Object>(context));
}

Configure prefer-multi-provider

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

falcon.jsonjson
{
  "linter": {
    "rules": {
      "style": {
        "prefer-multi-provider": "error"
      }
    }
  }
}

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

example.dartdart
// falcon-ignore lint/style/prefer-multi-provider: <reason>