Flutter数据流控制插件streamed_controller的使用

发布于 1周前 作者 sinazl 来自 Flutter

Flutter数据流控制插件streamed_controller的使用

简介

streamed_controller 是一个用于Flutter应用的状态管理库。它基于Flutter的 ChangeNotifier, StreamInheritedNotifier,并且不依赖于任何第三方库。它支持多种并发处理方式,并且可以方便地监听状态变化。

特点

  • 并发处理: 支持多样化的并发处理方式(如可丢弃、节流、去抖动、并发和可重启)。
  • 无第三方依赖: 基于Flutter的 ChangeNotifier, StreamInheritedNotifier
  • 多样的监听方式: 可以通过 ListenableBuilder, InheritedWidget/InheritedNotifier, StreamBuilder 等方式监听状态变化。
  • 复杂状态管理: 能够处理复杂的认证、分页、通知、加载和状态处理等场景。

开始使用

首先,在你的 pubspec.yaml 文件中添加 streamed_controller 依赖:

dependencies:
  streamed_controller: ^x.x.x

然后运行以下命令来安装该包:

flutter pub add streamed_controller

使用示例

定义控制器类

class TestControllerBase extends StreamedController<int> {
  TestControllerBase() : super(initialState: 0, eventHandler: ConcurrentConcurrencyHandler());

  void increment() => handle(_increment(), eventName: 'increment');

  Stream<int> _increment() => () async* {
    yield state + 1;
    await Future.delayed(const Duration(seconds: 2));
    yield state + 2;
  }();
}

创建控制器变量

final $controller = TestControllerBase();

监听状态变化

在需要响应状态变化的 Widget 中使用 ListenableBuilderAnimatedBuilder 来监听状态变化:

class _MyHomePageState extends State<MyHomePage> {
  final $controller = TestControllerBase();

  @override
  void initState() {
    $controller.addListener(() => print('[${$controller.runtimeType}] State: ${$controller.state}'));
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            const Text('You have pushed the button this many times:'),
            // 使用 ListenableBuilder 监听状态变化
            ListenableBuilder(
              listenable: $controller,
              builder: (context, child) => Text(
                '${$controller.state}',
                style: Theme.of(context).textTheme.headlineMedium,
              ),
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: $controller.increment,
        tooltip: 'Async increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}

自定义观察器

你可以创建自定义观察器来监听控制器的生命周期事件:

class _TestControllerObserver extends StreamedControllerObserver {
  @override
  void onCreate(StreamedController<Object> controller) =>
      print('${controller.runtimeType} created');

  @override
  void onDispose(StreamedController<Object> controller) =>
      print('${controller.runtimeType} disposed');

  @override
  void onError(StreamedController<Object>? controller, Object? error, StackTrace stackTrace) =>
      print('${controller.runtimeType} got error: $error');

  @override
  void onStateChanged(StreamedController<Object> controller, Object prevState, Object nextState) =>
      print('${controller.runtimeType} state updated, new state: $nextState');
}

然后将观察器分配给 StreamedController

StreamedController.observer = _TestControllerObserver();

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

1 回复

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


当然,关于Flutter中的streamed_controller插件(需要注意的是,Flutter官方生态系统并没有一个直接名为streamed_controller的插件,但假设你指的是一个自定义的或第三方的流控制器插件,或者可能是指Flutter中常用的流(Stream)控制机制),这里给出一个使用Flutter中的StreamController进行数据流控制的代码案例。

在Flutter中,StreamController是用来管理数据流的常用工具,它允许你发送数据给监听器(listeners),这些监听器可以实时响应数据流的变化。下面是一个简单的例子,展示如何在Flutter中使用StreamController:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'StreamController Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final StreamController<int> _controller = StreamController<int>();
  int _counter = 0;

  @override
  void dispose() {
    // 清理资源,关闭StreamController
    _controller.close();
    super.dispose();
  }

  void _incrementCounter() {
    setState(() {
      _counter++;
      // 向Stream发送数据
      _controller.add(_counter);
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('StreamController Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
      // 使用StreamBuilder监听StreamController的数据流
      bottomSheet: StreamBuilder<int>(
        stream: _controller.stream,
        builder: (context, snapshot) {
          if (snapshot.hasData) {
            return Text(
              'Stream data: ${snapshot.data}',
              style: TextStyle(color: Colors.red),
            );
          } else {
            return Container();
          }
        },
      ),
    );
  }
}

在这个例子中:

  1. 我们创建了一个StreamController<int>实例,用于管理整数类型的数据流。
  2. 当用户点击浮动按钮时,_incrementCounter方法会被调用,它增加_counter的值,并通过_controller.add(_counter)将新值发送到流中。
  3. 使用StreamBuilder组件监听这个流,当流中有新数据时,StreamBuilder会重新构建其子组件,显示最新的数据。
  4. dispose方法中,我们关闭StreamController以释放资源,这是一个好的实践,尤其是在组件可能被销毁时。

这个例子展示了如何使用Flutter中的StreamController和StreamBuilder来实现基本的数据流控制。如果你提到的streamed_controller是一个特定的第三方插件,请参考该插件的文档以获取更具体的用法。

回到顶部