flutter Stream流

在flutter中 stream是很中重要的,在现在市场面flutter中的状态管理框架基本上都是用stream流来实现的

Stream分类

流可以分为两类:

单订阅流(Single Subscription),这种流最多只能有一个监听器(listener)
多订阅流(Broadcast),这种流可以有多个监听器监听(listener)

Stream创建方式

stream创建有很多种,Stream.fromFuture、Stream.fromIterable等方式,但是一般不使用这种,我们使用StreamController

  • StreamController : 如类名描述,用于整个Stream过程的控制,提供各类接口用于创建各种事件流
  • StreamSink: 一般作为事件的入口,提供如add,addStream等
  • Stream: 事件源本身,一般可用于监听事件或者对事件进行转移,如listen、where。
  • StreamSubscription: 事件订阅后的对象,表面上可用于管理订阅过等各类操作,如cancel、pause,同时在内部也是事件的中转关键。
    单订阅流创建
//StreamController里面会创建一个Stream,我们实际操控的Stream
StreamController<String> streamController = StreamController();
streamController.stream.listen((data)=> print(data));
streamController.sink.add("11111");
streamController.add("2222");
streamController.close();

//多订阅流创建

StreamController<String> streamController = StreamController.broadcast();
    streamController.stream.listen((data){
      print(data);
    },onError: (error){
      print(error.toString());
    });
    streamController.stream.listen((data) => print(data));
    streamController.add("bbb");

//单订阅流转为多订阅流

  StreamController<String> streamController = StreamController();
  Stream stream =streamController.stream.asBroadcastStream();
  stream.listen((data) => print(data));
  stream.listen((data) => print(data));
  streamController.sink.add("aaa");
  streamController.close();

上面很常见的StreamController 流创建

高阶使用

EventBus使用 好东西

//工具类
class EventBusHelper {
static final EventBus _eventBus = new EventBus();

EventBusHelper._();

static void fire(dynamic event) {
 _eventBus.fire(event);
}
static Stream<EventType> getEventTypeStream<EventType>() {
 return _eventBus.on<EventType>();
}
}

class ImageBackEvent {
final int code;

ImageBackEvent(this.code);
}


//接受

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

StreamSubscription  stream =
     EventBusHelper.getEventTypeStream<ImageBackEvent>().listen((event) {
     //可以做自己操作
     });

}
//发送
EventBusHelper.fire(ImageBackEvent(1))

eventBus源码

import 'dart:async';


class EventBus {
  StreamController _streamController;

  /// Controller for the event bus stream.
  StreamController get streamController => _streamController;

  EventBus({bool sync = false})
      : _streamController = StreamController.broadcast(sync: sync);


  EventBus.customController(StreamController controller)
      : _streamController = controller;

//.where()监听满足给定条件的流中的数据
  Stream<T> on<T>() {
    if (T == dynamic) {
      return streamController.stream;
    } else {
      return streamController.stream.where((event) => event is T).cast<T>();
    }
  }

  /// Fires a new event on the event bus with the specified [event].
  ///
  void fire(event) {
    streamController.add(event);
  }

  /// Destroy this [EventBus]. This is generally only in a testing context.
  ///
  void destroy() {
    _streamController.close();
  }
}

Flutter是一种跨平台的移动应用开发框架,可以用于开发iOS和Android应用。要在Flutter中播放H264二进制,你可以使用flutter_ffmpeg插件来实现。 首先,你需要在Flutter项目中添加flutter_ffmpeg插件的依赖。在pubspec.yaml文件中添加以下代码: ``` dependencies: flutter_ffmpeg: ^0.4.0 ``` 然后运行`flutter pub get`命令来获取插件。 接下来,你可以使用flutter_ffmpeg插件提供的功能来播放H264二进制。以下是一个简单的示例代码: ```dart import 'package:flutter/material.dart'; import 'package:flutter_ffmpeg/flutter_ffmpeg.dart'; class H264Player extends StatefulWidget { @override _H264PlayerState createState() => _H264PlayerState(); } class _H264PlayerState extends State<H264Player> { FlutterFFmpeg _flutterFFmpeg = FlutterFFmpeg(); @override void initState() { super.initState(); playH264Stream(); } void playH264Stream() async { String command = '-i your_h264_stream_url -c:v copy -f flv rtmp://your_rtmp_server'; int result = await _flutterFFmpeg.execute(command); if (result == 0) { print('H264 stream playback started successfully.'); } else { print('Failed to start H264 stream playback.'); } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('H264 Player'), ), body: Center( child: Text('Playing H264 stream...'), ), ); } } ``` 在上面的代码中,我们创建了一个名为H264Player的Flutter小部件。在initState方法中,我们调用playH264Stream方法来播放H264二进制。你需要将your_h264_stream_url替换为实际的H264的URL,将your_rtmp_server替换为实际的RTMP服务器地址。 请注意,为了使用flutter_ffmpeg插件,你需要在项目中添加FFmpeg库。具体的步骤可以参考flutter_ffmpeg插件的文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值