flutter / flutter/flutter

Add `ListenableBuilder.all` to make it easier to listen to multiple listenables

Open
#159,652 3 comments 7 reactions 0 assignees View on GitHub
c: proposal framework P2 team-framework triaged-framework
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.