我爱模板网 > 建站教程 > dart >  dart笔记21:BlocProvider工具实现管理多个stream流正文

dart笔记21:BlocProvider工具实现管理多个stream流

dart笔记21:BlocProvider工具实现管理多个stream流,此笔记代码是基于“基于Bloc stream流实现数据处理和UI渲染分离”代码的基础上进行的修改,通过实现BlocProvider类,来管理多个stream流,更加强大。

bloc_base.dart代码:
1abstract class BlocBase {
2  void dispose();
3}
bloc_provider.dart代码:
01import 'package:flutter/widgets.dart';
02import 'bloc_base.dart';
03 
04Type _typeOf<T>() => T;
05 
06class BlocProvider<T extends BlocBase> extends StatefulWidget {
07  BlocProvider({Key key, @required Widget this.child, @required this.blocs})
08      : super(key: key);
09 
10  final Widget child;
11  final List<T> blocs;
12 
13  _BlocProviderState<T> createState() => _BlocProviderState<T>();
14 
15  static List<T> of<T extends BlocBase>(BuildContext context) {
16    final type = _typeOf<_BlocProviderInherited<T>>();
17    //通过BuildContext可以跨组件获取对象
18    //ancestorInheritedElementForWidgetOfExactType方法获得指定类型的InheritedWidget进而获取它的共享数据
19    _BlocProviderInherited<T> provider =
20        // ignore: deprecated_member_use
21        context.ancestorInheritedElementForWidgetOfExactType(type)?.widget;
22    return provider?.blocs;
23  }
24}
25 
26class _BlocProviderState<T extends BlocBase> extends State<BlocProvider<T>> {
27  @override
28  void dispose() {
29    widget.blocs.map((bloc) {
30      bloc.dispose();
31    });
32    super.dispose();
33  }
34 
35  @override
36  Widget build(BuildContext context) {
37    return _BlocProviderInherited<T>(
38      blocs: widget.blocs,
39      child: widget.child,
40    );
41  }
42}
43 
44/**
45 * InheritedWidget是flutter的一个功能型的Widget基类
46 * 它能有效的将数据再当前Widget树中向它的子Widget树传递
47 */
48class _BlocProviderInherited<T> extends InheritedWidget {
49  _BlocProviderInherited(
50      {Key key, @required Widget child, @required this.blocs})
51      : super(key: key, child: child);
52 
53  final List<T> blocs;
54 
55  /**
56   * 用来告诉InheritedWidget如果对数据进行了修改,
57   * 是否必须将通知传递给所有的子Widget(已注册/已订阅)
58   */
59  @override
60  bool updateShouldNotify(InheritedWidget oldWidget) => false;
61}
bloc_counter.dart代码:
01import 'dart:async';
02import 'bloc_base.dart';
03 
04class BlocCounter extends BlocBase {
05  final _controller = StreamController<int>();
06 
07  get _counter => _controller.sink;
08 
09  get counter => _controller.stream;
10 
11  void increment(int count) {
12    _counter.add(++count);
13  }
14 
15  @override
16  void dispose() {
17    _controller.close();
18  }
19}
main.dart代码:
01import 'package:flutter/material.dart';
02import 'bloc_counter.dart';
03import 'bloc_provider.dart';
04 
05void main() => runApp(MyApp());
06 
07class MyApp extends StatelessWidget {
08  @override
09  Widget build(BuildContext context) {
10    return MaterialApp(
11      title: 'blocprovider示例',
12      home: BlocProvider(
13        //放在顶层组件,下面的子组件才能传递数据,管理子组件的所有bloc
14        child: MyHomePage(),
15        blocs: [BlocCounter()], //一系列的blocs,管理这一系列的bloc
16      ),
17    );
18  }
19}
20 
21class MyHomePage extends StatefulWidget {
22  MyHomePage({Key key}) : super(key: key);
23 
24  @override
25  _MyHomePageState createState() => _MyHomePageState();
26}
27 
28class _MyHomePageState extends State<MyHomePage> {
29  int _counter = 0;
30 
31  _MyHomePageState();
32 
33  void _incrementCounter() {
34    // 调用第一个bloc的increment方法
35    BlocProvider.of<BlocCounter>(context).first.increment(_counter);
36  }
37 
38  @override
39  void initState() {
40    // 监听第一个bloc的counter的变化
41    BlocProvider.of<BlocCounter>(context).first.counter.listen((_count) {
42      setState(() {
43        _counter = _count;
44      });
45    });
46    super.initState();
47  }
48 
49  @override
50  Widget build(BuildContext context) {
51    return Scaffold(
52      appBar: AppBar(
53        title: Text('blocprovider示例'),
54      ),
55      body: Center(
56        child: Text(
57          '$_counter',
58          // ignore: deprecated_member_use
59          style: Theme.of(context).textTheme.display1,
60        ),
61      ),
62      floatingActionButton: FloatingActionButton(
63        onPressed: _incrementCounter,
64        child: Icon(Icons.add),
65      ),
66    );
67  }
68 
69  @override
70  void dispose() {
71    super.dispose();
72  }
73}



部分素材资源来源网站,本站提供免费下载,如有侵权请联系站长马上删除!
上一篇:Dart语法(二):操作符及构造函数 下一篇:dart笔记22:Isolate使用案例
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
选择头像:
最新评论

猜你喜欢