47Flutter Stream流的适用场景

Flutter之Stream流

1.介绍

为什么dart中会出现Stream流,以及它适合的场景,我们常常用到它的多订阅模式,为什么适用订阅模式。在我们android中,有EventBus,LiveData,LiveDataBus,以及BroadcastReceiver。采用发布订阅模式,在我们android应用开发中非常常见。

常见解决问题:

​ A页面订阅,B页面订阅,C页面订阅…等等,我们想在N页面发布一条消息,其他所有页面都能监听到。这便是它最常见的场景

注意:退出时,记得销毁, 其中LiveData不用,原因采用LifeCycle自行监听销毁了,其他需要,否则会造成难以挽回的内存泄漏。

2.适用方式,

上一篇转载的Flutter45文章中,已经介绍了Stream流的适用方式, 我们没有必要掌握那么多,但里面必须掌握多订阅模式和单订阅模式

3.多订阅模式适用

Page01页面,跳转到Page02页面,Page02发送消息,Page01监听消息, 多订阅流,是说可以有多个监听,最常用

如何适用

1.创建流对象

import 'dart:async';

StreamController<String> streamController = StreamController.broadcast();

2.设置流监听

 StreamSubscription _streamSubscription = streamController.stream.listen((event) {
      //然后在这里面进行更新数据的操作
      setState(() {
        values = event;
      });
    });

3.发送数据

  streamController.add("测试数据");

4.取消注册

_streamSubscription.cancel();

完整代码

Page01

import 'dart:async';

import 'package:flutter/material.dart';

import 'Page02.dart';
import 'StreamControllerDemo.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return MaterialApp(
      home:Scaffold(
        appBar:AppBar(
            title:Text('Flutter Demo')
        ),
        body:Page01(),
      ),
      theme: ThemeData(
          primarySwatch: Colors.yellow
      ),
    );
  }
}


class Page01 extends StatefulWidget {
  Page01({Key key}) : super(key: key);

  @override
  _Page01State createState() {
    return _Page01State();
  }
}

class _Page01State extends State<Page01> {
  ///消息订单对象
  StreamSubscription _streamSubscription;
  var values = "监听数据";

  @override
  void initState() {
    super.initState();

    ///监听二
    _streamSubscription = streamController.stream.listen((event) {
      //然后在这里面进行更新数据的操作
      setState(() {
        values = event;
      });
    });
  }

  @override
  void dispose() {
    super.dispose();
    _streamSubscription.cancel();
  }

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Column(
      children: [
        Text(values),
        RaisedButton(
            child: Text("跳转到第二个页面页面"),
            onPressed: () {
              //路由跳转
              Navigator.of(context).push(
                  MaterialPageRoute(
                      builder: (context)=>Page02()
                  )
              );
            },
            color: Theme.of(context).accentColor,
            textTheme: ButtonTextTheme.primary)
      ],
    );
  }
}

Page02

import 'package:flutter/material.dart';

import 'StreamControllerDemo.dart';

class Page02 extends StatefulWidget {
  Page02({Key key}) : super(key: key);

  @override
  _Page02State createState() {
    return _Page02State();
  }
}

class _Page02State extends State<Page02> {
  ///消息订单对象

  @override
  void initState() {
    super.initState();
  }

  @override
  void dispose() {
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Column(
      children: [
        SizedBox(height: 50),
        RaisedButton(
            child: Text("发送数据"),
            onPressed: () {
              streamController.add("测试数据");
            },
            color: Theme.of(context).accentColor,
            textTheme: ButtonTextTheme.primary),
        RaisedButton(
            child: Text("返回第一个页面,查看数值是否变化"),
            onPressed: () {
              //路由跳转
              Navigator.of(context).pop();
            },
            color: Theme.of(context).accentColor,
            textTheme: ButtonTextTheme.primary)
      ],
    );
  }
}

StreamControllerDemo

import 'dart:async';

StreamController<String> streamController = StreamController.broadcast();

4.单订阅流

单订阅流只允许有一个监听,用StreamController();来创建,不常用,原因:当有多个listen监听时,会报错

StreamController<String> streamSingController = StreamController();

5.讲解StreamSubscription

  • _streamSubscription.pause(): 暂停接收消息
  • _streamSubscription.resume():恢复接收消息
  • _streamSubscription.cancel():取消消息订阅,记住,执行取消消息订阅之后,订阅监听不可复用,于android eventBus,BroadcastReceiver都是一样的
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值