dart笔记21:BlocProvider工具实现管理多个stream流,此笔记代码是基于“
基于Bloc stream流实现数据处理和UI渲染分离”代码的基础上进行的修改,通过实现BlocProvider类,来管理多个stream流,更加强大。
bloc_base.dart代码:
1 | abstract class BlocBase { |
bloc_provider.dart代码:
01 | import 'package:flutter/widgets.dart' ; |
02 | import 'bloc_base.dart' ; |
04 | Type _typeOf<T>() => T; |
06 | class BlocProvider<T extends BlocBase> extends StatefulWidget { |
07 | BlocProvider({Key key, @required Widget this .child, @required this .blocs}) |
13 | _BlocProviderState<T> createState() => _BlocProviderState<T>(); |
15 | static List<T> of<T extends BlocBase>(BuildContext context) { |
16 | final type = _typeOf<_BlocProviderInherited<T>>(); |
19 | _BlocProviderInherited<T> provider = |
21 | context.ancestorInheritedElementForWidgetOfExactType(type)?.widget; |
22 | return provider?.blocs; |
26 | class _BlocProviderState<T extends BlocBase> extends State<BlocProvider<T>> { |
29 | widget.blocs.map((bloc) { |
36 | Widget build(BuildContext context) { |
37 | return _BlocProviderInherited<T>( |
48 | class _BlocProviderInherited<T> extends InheritedWidget { |
49 | _BlocProviderInherited( |
50 | {Key key, @required Widget child, @required this .blocs}) |
51 | : super (key: key, child: child); |
60 | bool updateShouldNotify(InheritedWidget oldWidget) => false ; |
bloc_counter.dart代码:
02 | import 'bloc_base.dart' ; |
04 | class BlocCounter extends BlocBase { |
05 | final _controller = StreamController<int>(); |
07 | get _counter => _controller.sink; |
09 | get counter => _controller.stream; |
11 | void increment(int count) { |
12 | _counter.add(++count); |
main.dart代码:
01 | import 'package:flutter/material.dart' ; |
02 | import 'bloc_counter.dart' ; |
03 | import 'bloc_provider.dart' ; |
05 | void main() => runApp(MyApp()); |
07 | class MyApp extends StatelessWidget { |
09 | Widget build(BuildContext context) { |
11 | title: 'blocprovider示例' , |
15 | blocs: [BlocCounter()], |
21 | class MyHomePage extends StatefulWidget { |
22 | MyHomePage({Key key}) : super (key: key); |
25 | _MyHomePageState createState() => _MyHomePageState(); |
28 | class _MyHomePageState extends State<MyHomePage> { |
33 | void _incrementCounter() { |
35 | BlocProvider.of<BlocCounter>(context).first.increment(_counter); |
41 | BlocProvider.of<BlocCounter>(context).first.counter.listen((_count) { |
50 | Widget build(BuildContext context) { |
53 | title: Text( 'blocprovider示例' ), |
59 | style: Theme.of(context).textTheme.display1, |
62 | floatingActionButton: FloatingActionButton( |
63 | onPressed: _incrementCounter, |
64 | child: Icon(Icons.add), |
部分素材资源来源网站,本站提供免费下载,如有侵权请联系站长马上删除!