Last active
April 26, 2020 02:07
-
-
Save necatisozer/454d8810462f9c48b35f275395d7c424 to your computer and use it in GitHub Desktop.
A ChangeNotifierProvider wrapper for consuming the value immediately.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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