Flutter流处理插件fancy_stream的使用

Flutter流处理插件fancy_stream的使用

通过增强流的功能,创建了这个库,使其在任何项目中都非常容易使用。它与Bloc架构完美搭配,但同时现代且独立,可以用于任何其他上下文。

不推荐给刚开始学习如何使用流的人,因为这个库提供的简便性会让初学者无法掌握流的基本用法。

传统方式 - 处理事件/状态

使用流的传统方式几乎是这样的:你需要一个控制器、sink和stream,每当你处理一个流时都需要这些对象。你还需要关闭/取消每个必要的对象。

YourBloc

class HomeBloc  {
  BehaviorSubject<HomeEvent> _controller =  BehaviorSubject();
  Function(HomeEvent) get dispatchEvent => _controller.sink.add;
  Stream<HomeEvent> get homeEvents$ => _controller.stream;
  StreamSubscription subscription;
  
  HomeBloc(){
    subscription = homeEvents$.listen(_handleEvents);
    dispatchEvent(LoadTalks());
  }
  
  dispose(){
    _controller.close();
    subscription?.cancel();

  }
}

yourWidget

StreamBuilder<HomeEvent>(
  stream: homeBloc.homeEvents$,
  builder: ...);                 

当你在一个复杂的widget中处理多个流时,可能会超过30行的样板代码,而每个人都讨厌样板代码。

现代方式 - 处理事件/状态

现在我将向你展示fancy streams的强大之处,无需一行样板代码。

YourBloc

class HomeBloc extends FancyDelegate {

  HomeBloc() {    
    listenOn<HomeEvent>(_handleEvents);
    dispatchOn<HomeEvent>(LoadTalks());
  }
}

// Disposable.dispose函数会自动调用power streams的cleanAll方法。

yourWidget

StreamBuilder<HomeEvent>(
  stream: homeBloc.streamOf<HomeEvent>(),
  builder: ...);                 

传统方式 - 处理表单

现代方式 - 处理表单

完整示例

以下是一个完整的示例代码:

import 'package:fancy_stream/fancy_stream.dart';
import 'package:fancy_stream/src/fancy_imp.dart';

class Example {
  void main(List<String> args) {
    Fancy fancy = FancyImp();
    // 监听一个字符串,键为"print"
    fancy.listenOn<String>(printWhenDispatchedValue, key: "print");
    fancy.dispatchOn<String>("Print that!", key: "print");

    // 监听一个字符串,不指定键
    fancy.listenOn<String>(printWhenDispatchedValue);
    fancy.dispatchOn<String>("Print that without key!");

    // 获取所有映射值
    final values = fancy.map;
    printWhenDispatchedValue(values.toString());

    /// 清除所有Subject, Subscription和生成的实例
    fancy.dispose();
  }

  void printWhenDispatchedValue(String value) {
    print(value);
  }
}

更多关于Flutter流处理插件fancy_stream的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter流处理插件fancy_stream的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


fancy_stream 是一个用于 Flutter 的流处理插件,它可以帮助你更方便地处理和管理数据流。通过 fancy_stream,你可以轻松地创建、转换和订阅数据流,而无需编写复杂的流处理逻辑。

以下是如何在 Flutter 项目中使用 fancy_stream 插件的步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 fancy_stream 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  fancy_stream: ^0.0.1 # 请使用最新版本

然后运行 flutter pub get 来获取依赖。

2. 导入插件

在你的 Dart 文件中导入 fancy_stream 插件:

import 'package:fancy_stream/fancy_stream.dart';

3. 创建流

你可以使用 FancyStream 类来创建一个流,并为其添加数据:

final stream = FancyStream<int>();

4. 添加数据到流中

你可以使用 add 方法向流中添加数据:

stream.add(1);
stream.add(2);
stream.add(3);

5. 订阅流

你可以使用 listen 方法来订阅流,并处理流中的数据:

stream.listen((data) {
  print('Received data: $data');
});

6. 转换流

fancy_stream 还提供了一些内置的转换方法,例如 mapwhere 等,你可以使用这些方法来对流进行转换:

stream
  .where((data) => data > 1) // 过滤掉小于等于1的数据
  .map((data) => data * 2) // 将数据乘以2
  .listen((data) {
    print('Transformed data: $data');
  });

7. 关闭流

当你不再需要流时,可以调用 close 方法来关闭流:

stream.close();

8. 处理错误

你可以通过 onError 方法来处理流中的错误:

stream.listen(
  (data) {
    print('Received data: $data');
  },
  onError: (error) {
    print('Error occurred: $error');
  },
);

9. 使用 StreamBuilder

在 Flutter 中,你可以将 fancy_streamStreamBuilder 结合使用,以在 UI 中展示流中的数据:

StreamBuilder<int>(
  stream: stream,
  builder: (context, snapshot) {
    if (snapshot.hasData) {
      return Text('Data: ${snapshot.data}');
    } else if (snapshot.hasError) {
      return Text('Error: ${snapshot.error}');
    } else {
      return Text('Waiting for data...');
    }
  },
);

10. 完整的示例

以下是一个完整的示例,展示了如何使用 fancy_stream 插件:

import 'package:flutter/material.dart';
import 'package:fancy_stream/fancy_stream.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: StreamExample(),
    );
  }
}

class StreamExample extends StatefulWidget {
  [@override](/user/override)
  _StreamExampleState createState() => _StreamExampleState();
}

class _StreamExampleState extends State<StreamExample> {
  final stream = FancyStream<int>();

  [@override](/user/override)
  void initState() {
    super.initState();

    // 添加数据到流中
    stream.add(1);
    stream.add(2);
    stream.add(3);

    // 订阅流
    stream.listen((data) {
      print('Received data: $data');
    });

    // 转换流
    stream
      .where((data) => data > 1) // 过滤掉小于等于1的数据
      .map((data) => data * 2) // 将数据乘以2
      .listen((data) {
        print('Transformed data: $data');
      });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Fancy Stream Example'),
      ),
      body: Center(
        child: StreamBuilder<int>(
          stream: stream,
          builder: (context, snapshot) {
            if (snapshot.hasData) {
              return Text('Data: ${snapshot.data}');
            } else if (snapshot.hasError) {
              return Text('Error: ${snapshot.error}');
            } else {
              return Text('Waiting for data...');
            }
          },
        ),
      ),
    );
  }

  [@override](/user/override)
  void dispose() {
    stream.close(); // 关闭流
    super.dispose();
  }
}
回到顶部