Flutter中的异步组件-StreamBuild-Stream(一)

Stream是一个事件流,可以实现异步触发事件,可以做到不同代码块的事件通知,类似于EventBus。与StreamBuilder配合使用可以做到局部刷新。
该代码简单的对StreamBuild进行演示,程序的效果是执行一个持续发射事件的流,不同的注释有不同的效果,可以切换代码进行尝试,本篇的重点是StreamBuildStream的简单使用。实际开发中直接使用Stream的地方不多,但是很多相关的组件是用这个为基础的,有时候会涉及到Stream的api,这里只是一个简单例子,作为入门了解的地方,可以在此基础上对更多的代码进行了解

///用来展示StreamBuild异步任务的代码演示
///FutureBuild用来处理单次的异步任务,该组件可以用来处理多次的异步任务,比如事件流
///对于详细的使用需要了解一下异步任务中的Stream事件流,这里只做简单的介绍
import 'dart:async';
import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Material App',
      home: Scaffold(
        appBar: AppBar(
          title: Text('Material App Bar'),
        ),
        body: StreamBuilder<int>(
          initialData: -1,
          stream: _counter() ,//返回值要和接收的类型一致
          // stream: _counter ,//返回值要和接收的类型一致
          // stream: _error(),//错误内容
          builder: (BuildContext context, AsyncSnapshot<int> snapshot){//需要返回一个Widget

            if(snapshot.hasError){
              int error = snapshot.error;
              print('YM------>发生错误:$error');
            }

            switch(snapshot.connectionState){
              case ConnectionState.none:
                print('YM------>事件为none');
                break;
              case ConnectionState.waiting:
                print('YM------>事件在等待执行中');
                break;
              case ConnectionState.active://Stream流中,每次发送数据都会在这里执行
                int value = snapshot.data;
                print('YM------>事件在活动中:值为:$value');
                break;
              case ConnectionState.done:
                print('YM------>事件结束');
                break;
            }
            return Container();
          },

        ),
      ),
    );
  }

  // 使用Stream来处理
  // _counter(){
  //   Duration interval = Duration(seconds: 1);
  //   Stream<int> stream = Stream.periodic(interval, (data) => data);//每隔一秒输出一个数字,这是一个无限的流
  //   stream = stream.take(10); //指定发送事件个数,这里注意,计数十次,第十次的话会结束,而不是像单纯的dart一样
  //   // stream = stream.takeWhile((element) => element<5);//如果值小于20的话就一直输出
  //   return stream;
  // }

  //发射错误内容
  _error(){
    return Stream<int>.error(-99);
  }

  //使用async*来处理,这个代码参考flutter/widgets/async.dart
  //参考链接:https://cloud.tencent.com/developer/article/1633899
  //参考链接:https://jelenaaa.medium.com/what-are-sync-async-yield-and-yield-in-dart-defe57d06381
   Stream<int> _counter() async*{
    await Future<void>.delayed(Duration(seconds: 1));//等1秒发射
    yield 1;
    await Future<void>.delayed(Duration(seconds: 1));//等1秒发射
    yield 2;
    await Future<void>.delayed(Duration(seconds: 1));//等1秒发射
    yield 3;
    //在最后一个yield后面需要延迟一会儿,否则值无法生成,yield其实也有生成器函数的意思
    await Future<void>.delayed(Duration(seconds: 1));
  }

  //这是将一个自执行函数定义为一个变量,这个代码参考flutter/widgets/async.dart
  // Stream<int> _counter = (() async* {
  //    await Future<void>.delayed(Duration(seconds: 1));
  //    yield 1;
  //    await Future<void>.delayed(Duration(seconds: 1));
  //    yield 2;
  //    //在最后一个yield后面需要延迟一会儿,否则值无法生成,yield其实也有生成器函数的意思
  //    await Future<void>.delayed(Duration(seconds: 1));
  //  })();

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值