Flutter 状态管理之Bloc
2019-10-10 本文已影响0人
王俏
定义bloc
import 'dart:async';
import 'package:flutter/material.dart';
class CounterHome extends StatelessWidget {
@override
Widget build(BuildContext context) {
CounterBloc _counterBloc = CounterProvider.of(context).bloc;
return StreamBuilder(
initialData: 0,
stream: _counterBloc.count,
builder: (context, snapshot) {
return Center(
child: ActionChip(
label: Text('${snapshot.data}'),
onPressed: () {
_counterBloc.counter.add(1);
},
),
);
},
);
}
}
class CounterActionButton extends StatelessWidget {
@override
Widget build(BuildContext context) {
CounterBloc _counterBloc = CounterProvider.of(context).bloc;
return FloatingActionButton(
child: Icon(Icons.add),
onPressed: () {
_counterBloc.counter.add(1);
},
);
}
}
class CounterProvider extends InheritedWidget {
CounterProvider({Key key, this.child, this.bloc})
: super(key: key, child: child);
final Widget child;
final CounterBloc bloc;
static CounterProvider of(BuildContext context) {
return (context.inheritFromWidgetOfExactType(CounterProvider)
as CounterProvider);
}
@override
bool updateShouldNotify(CounterProvider oldWidget) {
return true;
}
}
class CounterBloc {
int _count = 0;
final _counterActionController = StreamController<int>();
StreamSink<int> get counter => _counterActionController.sink;
final _counterController = StreamController<int>();
Stream<int> get count => _counterController.stream;
CounterBloc() {
_counterActionController.stream.listen(onData);
}
void disponse() {
_counterActionController.close();
_counterController.close();
}
void onData(int data) {
print('$data');
_count = data + _count;
_counterController.add(_count);
}
void log() {
print('BloC');
}
}
使用
import './counter_bloc_demo.dart';
class BlocDemo extends StatelessWidget {
@override
Widget build(BuildContext context) {
return CounterProvider(
bloc: CounterBloc(),
child:Scaffold(
appBar: AppBar(
title: Text('BlocDemo'),
elevation: 0.0,
),
body: CounterHome(),
floatingActionButton: CounterActionButton(),
),
);
}
}