美文网首页
Flutter UI与数据分离(streamBuilder)

Flutter UI与数据分离(streamBuilder)

作者: 有一种感动叫做丶只有你懂 | 来源:发表于2019-11-05 17:39 被阅读0次

    1.简书

    页面中UI与数据分离有多种方案,现在使用的一种就是StreamBuilder;

    2.页面结构

    第一步:将bloc与widget绑定

    class Home extends StatelessWidget {
      @override 
      Widget build(BuildContext context){
        return BlocProvider(
              bloc:HomeBloc(),
              child:HomeWidget()
        )
      }
    }
    

    第二部:在Widget中获取bloc实例

    class HomeWidget extends StatefulWidget {
      HomeBloc _homeBloc;
      @override 
      void initState(){
        _homeBloc = BlocProvider.of<HomeBloc>(context);
      }
      @override 
      Widget build(BuildContext context){
          return Column(children:<Widget>[
            StreamBuilder(
                stream:_homeBloc.actionStream,
                initialData:0,
                builder:(BuilderContext context,AsyncSnapshot snapshot){
                      return Text(shapshot.data);
                  }
    
          ),
          RaisedButton(child: Text('+'),onPressed: () => _homeBloc.increment(),)
    
        ])
      
      }
    
    }
    

    第三步:创建homeBloc(此处实现了一个抽象类,是因为BlocProvider里面规定了所有的Bloc必须继承BlocBase)

    class HomeBloc implements BlocBase {
        int _counter = 0;
        StreamController<int> _streamController = StreamController<int> ();//初始化一个Stream控制器
        StreamSink get actionSink => _streamController.sink;//可以调用StreamController中的方法
        StreamSink get actionStream => _streamController.stream;//Stream里面的数据流向
        
        /**
         * 增加数据的方法
         */
        increment(){
           _counter++;
          actionSink.add(_counter);
      }
    }
    

    3.BlocProvider实现

    import 'package:flutter/widgets.dart';
    
    abstract class BlocBase {
      void dispose();
    }
    
    class BlocProvider<T extends BlocBase> extends StatefulWidget{
      BlocProvider({
        Key key,
        @required this.bloc,
        @required this.child
    
      }):super(key:key);
    
      final T bloc;
      final Widget child;
      static T of<T extends BlocBase>(BuildContext context){
        final type = _typeOf<BlocProvider<T>>();
        BlocProvider<T> provider = context.ancestorWidgetOfExactType(type);
        return provider.bloc;
      }
    
      ///获取类型
      static Type _typeOf<T>() => T;
    
    
      @override
      State<StatefulWidget> createState() => _BlocProvider();
    }
    
    class _BlocProvider extends State<BlocProvider<BlocBase>>{
      @override
      void dispose() {
        // TODO: implement dispose
        super.dispose();
        widget.bloc.dispose();//自动销毁
      }
    
      @override
      Widget build(BuildContext context) {
        return widget.child;
      }
    }
    
    

    相关文章

      网友评论

          本文标题:Flutter UI与数据分离(streamBuilder)

          本文链接:https://www.haomeiwen.com/subject/sxlebctx.html