Presenting Streams in Flutter

目录

如果我想要做一个组件,每秒更新时间, 最开始的想法就是使用StatefulWidget, 然后每秒调用一下setState方法刷新数据

能不能换成使用StatelessWidget呢? 可以的,不过用Stream来实现。

先创建一个AsyncSnapshot的拓展

extends PresentAsyncSnapshot<E> on AsyncSnapshot<E> {
    Widget present({
        required BuildContext context,
        Widget Function(BuildContext context)? onNone,
        Widget Function(BuildContext context, E data)? onData,
        Widget Function(BuildContext context, Object error, StackTrace stackTrace)? onError,
        Widget Function(BuildContext context)? onDoneWitNeitherDataNorError,
        Widget FUnction(BuildContext context)? onWaiting,
    }) {
        switch (connectionState) {
            case ConnectionState.none:
                return onNone?.call(context) ?? const SizedBox.shrink();
            case ConnectionState.waiting:
                return onWaiting?.call(context) ?? const CircularProgressIndicator();
            case ConnectionState.active: //future在done状态产生值,但是stream在active状态下就已经持续产生值了
            case ConnectionState.done:
                if (hasError) {
                    return onError?.call(context, error!, stackTrace!) ?? const SizedBox.shrink();
                } else if (hasData) {
                    return onData?.call(context, data as E) ?? const SizedBox.shrink();
                } else {
                    reutrn onDoneWitNeitherDataNorError?.call(context) ?? const SizedBox.shrink();
                }
        }
    }
}
复制代码

创建一个stream,每秒产生一个值

Stream<String> getDataTime() => Stream.perioodic(
    const Duration(seconds: 1),
    (_) => DateTime.now().toIso8601string(),
);
复制代码

为了方便使用,我又创建了一个Stream的拓展,为了内部使用上面写的PresentAsyncSnapshot拓展

extension PresentStream<E> on Stream<E> {
    Widget present({
        Widget Function(BuildContext context)? onNone,
        Widget Function(BuildContext context, E data)? onData,
        Widget Function(BuildContext context, Object error, E data)? onData,
        Widget Function(BuildContext context)? onDoneWitNeitherDataNorError,
        Widget Function(BuildContext context)? onWaiting.
    }) {
        return StreamBuilder<E>(
            stream: this,
            builder: (context, snapshot) => snapshot.present(
                context: context,
                onNone: onNone,
                onData: onData,
                onError: onError,
                onDoneWitNeitherDataNorError: onDoneWItNeitherDataNorError,
                onWaiting: onWaiting,
            ),
        );
    }
}
复制代码

下面来测试一下,只需要在任何Stream的地方 调用present()就能很简单的使用,可以传入你想要调用的任何方法的回调。

class HomePage extends StatelessWidget {
    const HomePage({Key? key}): super(key: key);

    @override
    Widget build(BuildContext context) {
        return Scaffold(
            body: SafeArea(
                child: getDateTime().present(
                    onData: (_, dateTime) => Text(dateTime),
                ),
            ),
        );
    }
}
复制代码

大功告成,下面看一下结果

以上就是Presenting Streams in Flutter的详细内容,更多关于Flutter Presenting Streams的资料请关注我们其它相关文章!

(0)

相关推荐

  • Presenting Streams in Flutter

    目录 如果我想要做一个组件,每秒更新时间, 最开始的想法就是使用StatefulWidget, 然后每秒调用一下setState方法刷新数据 能不能换成使用StatelessWidget呢? 可以的,不过用Stream来实现. 先创建一个AsyncSnapshot的拓展 extends PresentAsyncSnapshot<E> on AsyncSnapshot<E> { Widget present({ required BuildContext context, Widge

  • Flutter EventBus事件总线的应用详解

    目录 前言 EventBus的简介 EventBus的实际应用 总结 前言 flutter项目中,有许多可以实现跨组件通讯的方案,其中包括InheritedWidget,Notification,EventBus等.本文主要探讨的是EventBus事件总线实现跨组件通讯的方法. EventBus的简介 EventBus的核心是基于Streams.它允许侦听器订阅事件并允许发布者触发事件,使得不同组件的数据不需要一层层传递,可以直接通过EventBus实现跨组件通讯. EventBus最主要是通过

  • 深入理解PHP中的Streams工具

    Streams 是PHP提供的一个强有力的工具,我们常常在不经意会使用到它,如果善加利用将大大提高PHP的生产力. 驾驭Streams的强大力量后,应用程序将提升到一个新的高度. 下面是PHP手册中对Streams的一段描述: Streams 是在PHP 4.3.0版本被引入的,它被用于统一文件.网络.数据压缩等类文件的操作方式,为这些类文件操作提供了一组通用的函数接口.简而言之,一个stream就是一个具有流式行为的资源对象.也就是说,我们可以用线性的方式来对stream进行读取和写入.并且可

  • Node.js Streams文件读写操作详解

    Node.js 天生异步和事件驱动,非常适合处理 I/O 相关的任务.如果你在处理应用中 I/O 相关的操作,你可以利用 Node.js 中的流(stream).因此,我们先具体看看流,理解一下它们是怎么简化 I/O 操作的吧. 流是什么 流是 unix 管道,让你可以很容易地从数据源读取数据,然后流向另一个目的地. 简单来说,流不是什么特别的东西,它只是一个实现了一些方法的 EventEmitter .根据它实现的方法,流可以变成可读流(Readable),可写流(Writable),或者双向

  • PHP中的Streams详细介绍

    Streams 是PHP提供的一个强有力的工具,我们常常在不经意会使用到它,如果善加利用将大大提高PHP的生产力. 驾驭Streams的强大力量后,应用程序将提升到一个新的高度. 下面是PHP手册中对Streams的一段描述: 复制代码 代码如下: Streams 是在PHP 4.3.0版本被引入的,它被用于统一文件.网络.数据压缩等类文件的操作方式,为这些类文件操作提供了一组通用的函数接口.简而言之,一个stream就是一个具有流式行为的资源对象.也就是说,我们可以用线性的方式来对stream

  • PHP Streams(流)详细介绍及使用

    PHP Streams是内置核心操作,可能一般的开发者很少用,它用于统一文件.网络.数据压缩等类文件操作方式,并为这些类文件操作提供一组通用的函数接口. 一个stream就是一个具有流式行为的资源对象,每个stream对象都有一个包装类.Stream 可以通过<scheme>://<target>方式来引用.其中<scheme>是包装类的名字,<target>中的内容是由包装类的语法指定,不同的包装类的语法会有所不同. 来看看PHP 默认有哪些内置的包装类:

  • PHP中的流(streams)浅析

    概述 流(streams)是PHP4.3版本引入的一个特性,主要是为了统一文件.sockets以及其他类似资源的工作方法.PHP4.3距今已经有很长时间了,但是很多程序员似乎都不能正确使用PHP中的流,当然这也包括我.以前也在一些程序中遇到过流的使用,如php://input,但是一直没机会整理,今天就把这部分知识整理下. 流是由PHP提供的资源,可以供我们透明的使用,而且流是一个非常强大的工具.适当的在程序中使用流,可以将我们的程序带到一个新的高度. PHP手册中对流的描述如下: 复制代码 代

  • PHP流Streams、包装器wrapper概念与用法实例详解

    本文实例讲述了PHP流Streams.包装器wrapper概念与用法.分享给大家供大家参考,具体如下: 流Streams这个概念是在php4.3引进的,是对流式数据的抽象,用于统一数据操作,比如文件数据.网络数据.压缩数据等,以使可以共享同一套函数,php的文件系统函数就是这样的共享,比如file_get_contents()函数即可打开本地文件也可以访问url就是这一体现.简单点讲,流就是表现出流式数据行为的资源对象. 以线性方式进行读写,并可以在流里面任意位置进行搜索. 流有点类似数据库抽象

  • Flutter pageview切换指示器的实现代码

    PageView 是一个滑动视图列表,它也是继承至 CustomScrollView 的. 在 PageView 里有三个构造函数: PageView - 创建一个可滚动列表. PageView.builder - 创建一个滚动列表,指定数量. PageView.custom - 创建一个可滚动的列表,自定义子项. 效果 代码 // Copyright 2017, the Flutter project authors. Please see the AUTHORS file // for de

  • Flutter Http分块下载与断点续传的实现

    本文来自笔者所著<Flutter实战>,读者也可以点击查看在线电子版. 基础知识 Http协议定义了分块传输的响应header字段,但具体是否支持取决于Server的实现,我们可以指定请求头的"range"字段来验证服务器是否支持分块传输.例如,我们可以利用curl命令来验证: bogon:~ duwen$ curl -H "Range: bytes=0-10" http://download.dcloud.net.cn/HBuilder.9.0.2.m

随机推荐