title: MultiBlocProvider with dependences
body: <p>I try to make an AutoRouterWrapper page to provide my Blocs to the child pages. Both Blocs return async data from a firestore database. The problem is that for my pet data I first of all need all my friends returned from the UserWatcherBloc. Deep down in the PetWatcher I combine both the friendsStream and the stream coming from the pets db (see second code block).</p>
  <p>My current solution has the problem, that the BlocListener fires too fast and, as combineLatest in the petsStream needs to have values from both streams, the petBloc will not fire until the User changes in the database.</p>
  <p>Apart from that, my current solution is probably not good style, since I always need the friends from the UserBloc for the PetStream and it seems wrong to do this in the wrapper class.
  I do not want to combine these Blocs into one bloc, as I want to listen to them on different pages individually.
  Additionally, I do not want to open two separate user snapshotlisteners to firestore, as this results in twice as many reads if the friends/user changes.</p>
  <pre><code>  @override
    Widget wrappedRoute(BuildContext context) {
      StreamController&lt;IMap&lt;String, Friend&gt;&gt; streamController =
          StreamController&lt;IMap&lt;String, Friend&gt;&gt;();
      Stream&lt;IMap&lt;String, Friend&gt;&gt; friendsStream = streamController.stream;
  
      return MultiBlocProvider(
        providers: [
          BlocProvider&lt;PetWatcherBloc&gt;(
            create: (context) =&gt; getIt&lt;PetWatcherBloc&gt;()
                ..add(PetWatcherEvent.watchActiveStarted(friendsStream)),
          ),
          BlocProvider&lt;UserWatcherBloc&gt;(
              create: (context) =&gt; getIt&lt;UserWatcherBloc&gt;()
                ..add(const UserWatcherEvent.watchStarted())),
        ],
        child: BlocListener&lt;UserWatcherBloc, UserWatcherState&gt;(
          listener: (context, state) {
            state.maybeMap(
              loadSuccess: (state) =&gt; streamController.add(state.user.friends),
              orElse: () {},
            );
          },
          child: this,
        ),
      );
    }
  }
  
  </code></pre>
  <p>I combine both Stream in the following way:</p>
  <pre><code>Stream&lt;Either&lt;Failure, IList&lt;Pet&gt;&gt;&gt; watchActiveStarted(
       Stream friendsStream) async* {
  
      Stream&lt;QuerySnapshot&lt;Map&lt;String, dynamic&gt;&gt;&gt; petStream = FirebaseFirestore.instance
          .collection('pets')
          .snapshots();
  
      yield* petStream.combineLatest(friendsStream, (snapshot, friends) =&gt; right&lt;Failure, IList&lt;Pet&gt;&gt;(
              IList.from(snapshot.docs.map((doc) =&gt;
                      PetDto.fromFirestore(doc).toDomain(friends))),
            ),
          );
    }
  </code></pre>
  <p>What would be a better way to combine both streams for the petBloc and provide both blocs in the wrapper?</p>