Add `ListenableBuilder.all` to make it easier to listen to multiple listenables
- Dominant language
- Dart
- Stars
- 179k
- Forks
- 31.1k
- PR merge metrics
- PR metrics pending
Description
### Use case
Here's how you can listen to multiple `Listenable`s today.
#### Option 1 - multiple `ListenableBuilder`s
```dart
@override
Widget build(BuildContext context) {
return ListenableBuilder(
listenable: model1,
builder: (context, _) {
return ListenableBuilder(
listenable: model2,
builder: (context, _) {
return Text('Values: $model1, $model2');
},
);
},
);
}
```
This option is easy to discover but verbose.
#### Option 2 - `Listenable.merge`
```dart
@override
Widget build(BuildContext context) {
return ListenableBuilder(
listenable: Listenable.merge([model1, model2]),
builder: (context, _) {
return Text('Values: $model1, $model2');
},
);
}
```
This option is significantly less verbose. However, this option is hard to discover.
### Proposal
1. **Introduce `ListenableBuilder.all`**, which invokes its `builder` when one or more `Listenable`s change.
Example:
```dart
@override
Widget build(BuildContext context) {
return ListenableBuilder.all(
listenables: [model1, model2],
builder: (context, _) {
return Text('Values: $model1, $model2');
},
);
}
```
This is similar to the `Listenable.merge` option, however, it is easier to discover from the `ListenableBuilder` type.
If we do this change, we should also update `AnimatedBuilder`.
1. Update `ListenableBuilder`s docs to show how to listen to multiple `Listenable`s.
Contributor guide
Assessment
This issue has not been assessed yet.