provider 1.4.0
provider: ^1.4.0 copied to clipboard

outdated

An helper to easily exposes a value using InheritedWidget without having to write one.

Build Status pub package codecov

A generic implementation of InheritedWidget. It allows to expose any kind of object, without having to manually write an InheritedWidget ourselves.

Usage #

To expose a value, simply wrap any given part of your widget tree into any of the available Provider as such:

Provider<int>(
  value: 42,
  child: // ...
)

Descendants of Provider and now obtain this value using the static Provider.of<T> method:

var value = Provider.of<int>(context);

You can also use Consumer widget to insert a descendant, useful when both creating a Provider and using it:

Provider<int>(
  value: 42,
  child: Consumer<int>(
    builder: (context, value) => Text(value.toString()),
  )
)

Note that you can freely use multiple providers with different type together:

Provider<int>(
  value: 42,
  child: Provider<String>(
    value: 'Hello World',
    child: // ...
  )
)

And obtain their value independently:

var value = Provider.of<int>(context);
var value2 = Provider.of<String>(context);

Existing Providers: #

Provider #

A simple provider which takes the exposed value directly:

Provider<int>(
  value: 42,
  child: // ...
)

StatefulProvider #

A [Provider] that can also create and dispose an object.

It is usually used to avoid making a [StatefulWidget] for something trivial, such as instanciating a BLoC.

[StatefulBuilder] is the equivalent of a [State.initState] combined with [State.dispose]. As such, [valueBuilder] is called only once and is unable to use [InheritedWidget]; which makes it impossible to update the created value.

If this is too limiting, consider instead [HookProvider], which offer a much more advanced control over the created value.

The following example instanciate a Model once, and dispose it when [StatefulProvider] is removed from the tree.

class Model {
  void dispose() {}
}

class Stateless extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return StatefulProvider<Model>(
      valueBuilder: (context) =>  Model(),
      dispose: (context, value) => value.dispose(),
      child: ...,
    );
  }
}

HookProvider #

A provider which can use hooks from flutter_hooks

This is especially useful to create complex providers, without having to make a StatefulWidget.

The following example uses BLoC pattern to create a BLoC, provide its value, and dispose it when the provider is removed from the tree.

HookProvider<MyBloc>(
  hook: () {
    final bloc = useMemoized(() => MyBloc());
    useEffect(() => bloc.dispose, [bloc]);
    return bloc;
  },
  child: // ...
)
3497
likes
0
pub points
100%
popularity

Publisher

dash-overflow.net

An helper to easily exposes a value using InheritedWidget without having to write one.

Repository (GitHub)
View/report issues

Dependencies

flutter, flutter_hooks

More

Packages that depend on provider