import 'dart:async'; import 'package:bloc/bloc.dart'; import 'package:flutter/material.dart'; import 'bloc_module.dart'; class SwappingBloc { final TBloc initialBloc; final StreamController updater = StreamController(); SwappingBloc(this.initialBloc); void swap(TBloc bloc) { updater.add(bloc); } } class SwappingBlocModule, TState> extends StatefulWidget { final SwappingBloc bloc; final Widget Function(BuildContext context, TBloc bloc, TState state) child; const SwappingBlocModule({super.key, required this.bloc, required this.child}); @override State> createState() => _SwappingBlocModuleState(); } class _SwappingBlocModuleState, TState> extends State> { late TBloc bloc; @override void initState() { super.initState(); bloc = widget.bloc.initialBloc; widget.bloc.updater.stream.listen((event) { setState(() { bloc = event; }); }); } @override Widget build(BuildContext context) => BlocModule( autoRebuild: true, create: (context) => bloc, child: (context, bloc, state) => widget.child(context, bloc, state), ); }