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:
