Stream是什么?

为了将Stream的概念可视化与简单化,可以将它想成是管道(pipe)的两端,它只允许从一端插入数据并通过管道从另外一端流出数据。
在Flutter中,

  • 我们将这样的管道称作Stream
  • 为了控制Stream,我们通常可以使用StreamController来进行管理;
  • 为了向Stream中插入数据,StreamController提供了类型为StreamSink的属性​​sink​​作为入口;
  • StreamController提供​​stream​​属性作为数据的出口。

在Dart库中,有两种实现异步编程的方式(​​Future​​​和​​Stream​​​),使用它们只需要在代码中引入​​dart:async​​​即可。
本文主要介绍Stream的相关概念及利用其异步特性来实现简单的响应式编程。

 

Stream可以传输什么?

任何东西都可以!包括简单的值,事件,对象,集合,map,error或者其他的Stream,任何类型的数据都可以使用Stream来传输。

 

Stream简单应用

3s后打印输出结果。或者是测试异常输出

import 'package:flutter/material.dart';

class StreamDemo extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("StreamDemo"),
elevation: 0.0,
),
body: StreamDemoHome(),
);
}
}

class StreamDemoHome extends StatefulWidget {
@override
_StreamDemoHomeState createState() => _StreamDemoHomeState();
}

class _StreamDemoHomeState extends State<StreamDemoHome> {
void onData(String data) {
print("$data");
}

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

Future<String> fetchData() async {
await Future.delayed(Duration(seconds: 3));
throw "Something happend";
return "hello~";
}

void onError(error) {
print("onError $error");
}

void onDone() {
print("onDone");
}

print("Create a stream.");
Stream<String> _streamDemo = Stream.fromFuture(fetchData());
print("Start listening on a stream");
_streamDemo.listen(onData, onError: onError, onDone: onDone);
print("Initialize completed'");
}

@override
Widget build(BuildContext context) {
return Container();
}
}

输出