第二百二十回 如何把异步的CallBack转换成事件流

本文介绍了如何在Flutter中将异步的Callback转换为事件流,通过抽象类模拟回调,使用Stream和StreamBuilder实现实时更新,适用于响应式UI编程,尤其在处理蓝牙回调时提升用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


我们在上一章回中介绍了"如何修改StatusBar中文字的颜色"相关的内容,本章回中将介绍 如何把异步的CallBack转换成事件流.闲话休提,让我们一起Talk Flutter吧。

在这里插入图片描述

1. 概念介绍

我们在本章回中提到的Callback表示回调函数,我们将模拟创建回调函数,并且把回调函数转换事件流(Stream).因为我在使用蓝牙包时发现了很多的回调函数,它与响应式UI配合使用的效果不太好,所以我准备把回调函数转换成事件流,这样可以方便我们使用回调函数。

2. 思路与方法

2.1 实现思路

我们先介绍一下实现的思路。回调函数通过抽象类或者within语法实现。事件流通过Stream实现。在响应回调函数时向Stream中添加事件,进而形成事件流,在页面中只需要使用StreamBuidler组件就可以监听事件流。

2.2 实现方法

介绍完实现思路的后,我们详细介绍实现方法,下面是具体的实现步骤,请大家参考:

  • 创建一个抽象类,并且在类中创建空的方法用来实现回调函数;
  • 创建一个页面,在页面中创建StreamController对象;
  • 在页面类中实现抽象类中的方法,主要是使用StreamController对象向Stream中添加事件;
  • 在页面中使用StreamBuilder组件监听Steam中的事件;

3. 示例代码

//接口类,用来模拟回调方法
mixin CallBack {
  String _data = "default";

  ///用来模拟其它模块调用回调方法
  void changeData(String data) {
    _data = data;
    onDataChanged(_data);
  }

  void onDataChanged(String data) {}
}


class ExCircleAvatar extends StatefulWidget {
  const ExCircleAvatar({super.key});

  
  State<ExCircleAvatar> createState() => _ExCircleAvatarState();
}

///页面类实现抽象类中的方法
class _ExCircleAvatarState extends State<ExCircleAvatar> with CallBack {
  final StreamController<String> _dataStreamController = StreamController();

  
  void onDataChanged(String data) {

    super.onDataChanged(data);
    ///在监听到的回调中给stream添加事件,streamBuilder收到后会更新数据
    _dataStreamController.sink.add(data);
    ///按钮中通过changeData()方法模拟其它模块执行回调,这里相当于当前模拟监听到的回调中数据后
    debugPrint("Callback: $data");
  }

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

  
  Widget build(BuildContext context) {
    _dataStreamController.sink.add("default data");

    return Scaffold(
        appBar: AppBar(
          title: const Text("Example of Circle Avatar and LiveData",style: TextStyle(fontSize: 18),),
        ),
        body: Column(
          children: [
            TextButton(
              onPressed: () {
                changeData("data1");
              },
              child: const Text("Change data by CB"),
            ),
            ///使用Stream监听回调方法中的数据变化,点击上面的按钮相当于回调方法修改数据
            StreamBuilder(
              stream: _dataStreamController.stream,
              builder: (context, shotData) {
                return Text("data is: ${shotData.data}");
              },
            ),
          ],
        ));
  }

我们在上面的示例代码中,通过within语法创建抽象类,并且在页面类中实现了抽象类中的方法。代码中的内容与实现方法中的内容完全一致,大家可以参考实现方法中的步骤来阅读和理解理解代码。注意:在退出页面时关闭StreamController,进而释放相关的资源。

运行程序时通过按钮来修改数据,这相当于其它模块向回调函数发出事件,页面类中收到回调函数后向事件流中添加事件,这样就可以在页面中监听到事件流中的事件,示例代码中的Text组件会显示被修改后的数据。

4. 内容总结

最后,我们对本章回的内容做一个全面的总结:

  • 我们可以使用抽象类模拟回调函数;
  • 在实现回调函数时向Stream中添加事件;
  • 在页面中通过StreamBuilder监听事件流中的事件;

整个过程的核心是Stream,它用来实现事件流。与传统的回调方法相比,事件流更加适合响应式UI编程。这也是我们专门用一个章回中来介绍这些知识的原因。

看官们,与"如何把异步的CallBack转换成事件流"相关的内容就介绍到这里,欢迎大家在评论区交流与讨论!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

talk_8

真诚赞赏,手有余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值