Flutter网络编程——事件流Stream

事件流是与Flutter相关的一个重要概念,但也是Dart自带的,并不是Flutter独有的。可以将事件流想象成管道的两端,它只允许从一端流入数据并通过管道从另一端流出数据。
事件流可以使用StreamController来进行管理,StreamController提供了类型为StreamSinksink属性作为数据的入口,同时也提供了Stream属性作为数据的出口。事件流传输的数据类型,包括基本类型、事件、对象、集合、Map等。使用事件流中传输数据时,可以用listen()方法监听StreamControllerStream属性,通过listener监听,可以收到StreamSubscription对象,通过StreamSubscription对象就可以接收事件流发送数据变更的通知。
除了Stream外,Future也是异步处理的api。它们的不同之处在于,Future表示将来一次异步获取的数据,而Stream表示多次异步获取的数据。Future只有一次返回值,而Stream可以无限次地返回值。
代码示例:

class StreamPage extends StatefulWidget {
    
    
  final String title;
  const StreamPage({
    
    Key? key, required this.title}) : super(key: key);

  
  State<StreamPage> createState() => _StreamPageState();
}

class _StreamPageState extends State<StreamPage> {
    
    
  final StreamController<int> _streamController = StreamController<int>();
  int _counter = 0;

  
  void dispose() {
    
    
    _streamController.close();
    super.dispose();
  }

  
  Widget build(BuildContext context) {
    
    
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            const Text(
              '累计的数据',
              style: TextStyle(fontSize: 24),
            ),
            StreamBuilder(
                stream: _streamController.stream,
                initialData: 0,
                builder: (BuildContext context, AsyncSnapshot<int> snapshot) {
    
    
                  return Text(
                    '${
      
      snapshot.data}',
                    style: const TextStyle(fontSize: 24),
                  );
                }),
            OutlinedButton(
                onPressed: () => _streamController.sink.add(++_counter),
                child: Text(widget.title))
          ],
        ),
      ),
    );
  }
}

这里是点击按钮来累计数字,并通过_streamController.sink.add(++_counter)传入数据,然后再界面上通过StreamBuilder组件监听_streamController.stream发生的变化并获取值。其中initialData属性表示一个非空的初始化数据。
除了上面这种使用方式,Stream还有很多创建方式,比如可以通过Stream.fromFuture(Future future)创建新的单订阅流,当Future完成时会触发data/error,然后done事件结束。

  Future<String> getData() async {
    
    
    await Future.delayed(const Duration(seconds: 3));
    return '当前时间为:${
      
      DateTime.now()}';
  }

  _streamFromFuture() {
    
    
    Stream.fromFuture(getData()).listen((event) {
    
    
      print('Stream.fromFuture:$event');
    }).onDone(() {
    
    
      print('Stream.fromFuture:done');
    });
  }

总结:Stream是基于事件流来驱动并设计的代码,可以监听和订阅相关事件,并且对事件进行响应和处理。Flutter提供了很多创建订阅流的方法,比如:Stream.fromIterable(Iterable elements)通过数据集合获取并创建单订阅流,Stream.fromFutures(Iterable<Future> futures)通过一系列的Future创建新的单订阅流,等等。

猜你喜欢

转载自blog.csdn.net/Memory_of_the_wind/article/details/130964828