Skip to content

Instantly share code, notes, and snippets.

@necatisozer
Last active April 26, 2020 02:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save necatisozer/454d8810462f9c48b35f275395d7c424 to your computer and use it in GitHub Desktop.
Save necatisozer/454d8810462f9c48b35f275395d7c424 to your computer and use it in GitHub Desktop.
A ChangeNotifierProvider wrapper for consuming the value immediately.
import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart';
import 'package:provider/provider.dart';
import 'package:provider/single_child_widget.dart';
typedef Build<T> = Widget Function(BuildContext context, T value, Widget child);
/// A [ChangeNotifierProvider] wrapper for consuming [T] value immediately.
///
/// ## Creating a [ChangeNotifierProviderBuilder]
///
/// Create a new [ChangeNotifier] inside [create] and use it in [builder].
///
/// ```dart
/// ChangeNotifierProviderBuilder<MyChangeNotifier>(
/// create: (_) => MyChangeNotifier(),
/// builder: (context, myChangeNotifier, _) => ...
/// )
/// ```
///
/// If [listen] is `false`, later value changes will not trigger the [builder]
/// function.
///
/// ```dart
/// ChangeNotifierProviderBuilder<MyChangeNotifier>(
/// create: (_) => MyChangeNotifier(),
/// listen: false,
/// builder: (context, myChangeNotifier, _) => ...
/// )
/// ```
class ChangeNotifierProviderBuilder<T extends ChangeNotifier>
extends SingleChildStatelessWidget {
final Create<T> create;
final bool listen;
final bool lazy;
final Build builder;
ChangeNotifierProviderBuilder(
{Key key,
@required this.create,
this.lazy,
this.listen = true,
@required this.builder,
Widget child})
: assert(create != null),
assert(builder != null),
super(key: key, child: child);
@override
Widget buildWithChild(BuildContext context, Widget child) {
return ChangeNotifierProvider(
create: create,
lazy: lazy,
child: Builder(
builder: (context) =>
builder(context, Provider.of<T>(context, listen: listen), child)),
);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment