Presenting Streams in Flutter小技巧

 更新时间:2022年12月08日 14:28:24   作者:程序员界的小学生  
这篇文章主要为大家介绍了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拓展

为了方便使用,我又创建了一个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的资料请关注脚本之家其它相关文章!

相关文章

  • Android 如何拦截用户频繁操作(点击事件)

    Android 如何拦截用户频繁操作(点击事件)

    本文主要介绍了Android 如何拦截用户频繁操作,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Android仿优酷视频的悬浮窗播放效果

    Android仿优酷视频的悬浮窗播放效果

    这篇文章主要介绍了Android仿优酷视频的悬浮窗播放效果,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • 详解Android App卸载后跳转到指定的反馈页面的方法

    详解Android App卸载后跳转到指定的反馈页面的方法

    这篇文章主要介绍了Android App卸载后跳转到指定的反馈页面的方法,关键点是相关线程要判断在目录被消除以前作出响应,需要的朋友可以参考下
    2016-04-04
  • 详解Android 全局弹出对话框SYSTEM_ALERT_WINDOW权限

    详解Android 全局弹出对话框SYSTEM_ALERT_WINDOW权限

    本篇文章主要介绍了详解Android 全局弹出对话框SYSTEM_ALERT_WINDOW权限,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • 解决Android SDK下载和更新失败的方法详解

    解决Android SDK下载和更新失败的方法详解

    本篇文章是对Android SDK下载和更新失败的解决方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • Flutter开发之Widget自定义总结

    Flutter开发之Widget自定义总结

    这篇文章主要给大家介绍了关于Flutter开发中Widget自定义的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Flutter具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04
  • android 实现侧边弹窗特效代码

    android 实现侧边弹窗特效代码

    侧边弹窗是在左边,需要定位好位置,实现原理其实就是进出动效,用位移加透明度效果来控制,下面通过代码给大家介绍android 实现侧边弹窗,需要的朋友参考下吧
    2021-06-06
  • 详解Android 进程间通信的几种实现方式

    详解Android 进程间通信的几种实现方式

    在Android SDK中提供了4种用于跨进程通讯的方式。这篇文章主要介绍了详解Android 进程间通信的几种实现方式,有兴趣的可以了解一下。
    2017-01-01
  • Android端权限隐私的合规化处理实战记录

    Android端权限隐私的合规化处理实战记录

    大家应该都发现了,现在很多应用市场都要求应用上架需要用户协议,这篇文章主要给大家介绍了关于Android端权限隐私合规化处理的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-08-08
  • 使用Win10+Android+夜神安卓模拟器,搭建ReactNative开发环境

    使用Win10+Android+夜神安卓模拟器,搭建ReactNative开发环境

    今天小编就为大家分享一篇关于使用Win10+Android+夜神安卓模拟器,搭建ReactNative开发环境,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10

最新评论