Olá pessoal, um aluno perguntou como trocar o tema utilizando streams e a lib bloc_pattern. Na resposta criei este código de exemplo.

Resolvi colocar aqui caso ajude mais alguém pois é um exemplo interessante de como utilizar Streams.

import 'package:bloc_pattern/bloc_pattern.dart';
import 'package:flutter/material.dart';
import 'package:rxdart/rxdart.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return BlocProvider(
      blocs: [
        Bloc((i) => ThemeBloc()),
      ],
      child: new MainWidget(),
    );
  }
}

class MainWidget extends StatelessWidget {
  const MainWidget({
    Key key,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return StreamBuilder<bool>(
      stream: BlocProvider.getBloc<ThemeBloc>().stream,
      initialData: false,
      builder: (context, snapshot) {
        return MaterialApp(
          title: 'Flutter Demo',
          debugShowCheckedModeBanner: false,
          theme: snapshot.data ? ThemeData.dark() : ThemeData.light(),
          home: HomePage(snapshot.data),
        );
      },
    );
  }
}

class HomePage extends StatelessWidget {
  var flag;

  HomePage(this.flag);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Teste tema"),
        actions: <Widget>[
          FlatButton(
            child: Text("Light"),
            onPressed: () {
              BlocProvider.getBloc<ThemeBloc>().setDarkTheme(false);
            },
          ),
          FlatButton(
            child: Text("Dark"),
            onPressed: () {
              BlocProvider.getBloc<ThemeBloc>().setDarkTheme(true);
            },
          )
        ],
      ),
      body: Container(),
    );
  }
}

class ThemeBloc extends BlocBase {

  // stream
  final _controller = BehaviorSubject<bool>();
  get stream => _controller.stream;

  setDarkTheme(bool b) async {
    _controller.sink.add(b);
  }

  @override
  void dispose() {
    _controller.close();

    super.dispose();
  }
}

O resultado é trocar entre os temas Light e Dark pelo botão.

No arquivo main o StreamBuilder está "escutando" as alterações e vai trocar o tema. Por exemplo ao clicar no botão Dark o tema fica assim: