在 Flutter 中使用 Stream/Sink

2024-05-06

我正在尝试更换increment颤动应用程序代码,通过使用Streams http://www.dartlang.cc/docs/tutorials/streams/来自 Dart API 而不使用范围模型 https://pub.dartlang.org/packages/scoped_model or rxdart https://pub.dartlang.org/packages/rxdart.

所以我读了this https://stackoverflow.com/questions/14536437/how-do-you-create-a-stream-in-dart并观看了,但无法让它为我工作,我的代码是:

StreamProvider.dart:

import 'package:flutter/widgets.dart';
import 'businessLogic.dart';
import 'dart:async';

class Something {

  final _additionalContrllerr = StreamController<int>();
  Sink<int> get addition => _additionalContrllerr.sink;

  Stream<int> get itemCount =>  _additionalContrllerr.stream;
}

class StreemProvider extends InheritedWidget {
  final Something myBloc;  // Business Logic Component

  StreemProvider({
    Key key,
    @required this.myBloc,
    Widget child,
  }) : super(key: key, child: child);

  @override
  bool updateShouldNotify(InheritedWidget oldWidget) => true;

  static Something of(BuildContext context) =>
      (context.inheritFromWidgetOfExactType(StreemProvider) as StreemProvider)
          .myBloc;
}

main.dart:

import 'package:flutter/material.dart';
import 'package:flutter_app/StreemProvider.dart';

void main() => runApp(MyApp(
  textInput: Text("Provided By the Main"),
));

class MyApp extends StatefulWidget {
  final Widget textInput;
  MyApp({this.textInput});

  @override
  State<StatefulWidget> createState() => MyAppState();
}

class MyAppState extends State<MyApp> {
  bool checkBoxValue = false;

  int _counter = 0;
  @override
  Widget build(BuildContext ctxt) {
    var x = Something();      //// Not sure if have to use this!
    return StreemProvider(
      myBloc: x,              //// Not sure about this!!
      child: MaterialApp(
      home: SafeArea(
           child: Scaffold(
              body: new Center(
              child: new Column(
              children: <Widget>[
                widget.textInput,
                Text("clickec $_counter times"),
                Text("clickec ${x.itemCount.listen((int i) => i)} times"),
      /// How to get the value of i??!
                Checkbox(
                    value: checkBoxValue,
                    onChanged: (bool newValue){
                      setState(() {
                        checkBoxValue = newValue;
                      });
                    }
                )
              ],
            )),
             floatingActionButton: Incrementer(_increment),
            // floatingActionButton: Incrementer(x),
           ),
          ),
      ),
    );
  }

  _increment() {
    setState(() {
      _counter += 1;
    });
  }
}

class Incrementer extends StatefulWidget {

  final Function increment;

  Incrementer(this.increment);

  @override
  State<StatefulWidget> createState() {
    return IncrementerState();
  }
}
  class IncrementerState extends State<Incrementer>{
    @override
    Widget build(BuildContext ctxt) {
      final myBloc = StreemProvider.of(context);
      return new FloatingActionButton(
        //onPressed: widget.increment,
        // How ot get the latest value!!
        onPressed: () async {
          var y =  await myBloc.itemCount.last;
          if (y.isNaN) y = 0;
          myBloc.addition.add(y+1);
        },
        child: new Icon(Icons.add),
        );
    }
  }

不知道rx_dart的限制,但我只能尝试通过你使用它来回答。哈哈

你的块没有定义在你的输入流中监听什么,这就是我如何让它工作

counter_bloc.dart

import 'package:rxdart/rxdart.dart';
import 'dart:async';

class CounterBloc {
  int _count = 0;

  ReplaySubject<int> _increment = ReplaySubject<int>();
  Sink<int> get increment => _increment;

  BehaviorSubject<int> _countStream = BehaviorSubject<int>(seedValue: 0);
  Stream<int> get count => _countStream.stream;

  CounterBloc() {
    _increment.listen((increment) {
      _count += increment;
      _countStream.add(_count);
    });
  }
}

在构造函数中,为该流设置监听方法。对于发送的每个增量,它都会增加计数器并将当前计数发送到另一个流。

In main.dart,删除了 _counter 属性,因为它现在由 BLOC 处理。为了显示我使用了流生成器。

还添加了第二个晶圆厂,增量为 +2 以测试逻辑。

希望这可以帮助您为您的集团班级建模。 :)

一个很好的集团参考:https://www.youtube.com/watch?v=PLHln7wHgPE https://www.youtube.com/watch?v=PLHln7wHgPE

main.dart

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

void main() => runApp(MyApp());

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

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  CounterBloc bloc = CounterBloc();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            StreamBuilder<int>(
              stream: bloc.count,
              initialData: 0,
              builder: (BuildContext c, AsyncSnapshot<int> data) {
                return Text(
                  '${data.data}',
                  style: Theme.of(context).textTheme.display1,
                );
              },
            ),
          ],
        ),
      ),
      floatingActionButton: Row(
        mainAxisAlignment: MainAxisAlignment.end,
        children: <Widget>[
          FloatingActionButton(
            onPressed: () {
              bloc.increment.add(2);
            },
            tooltip: 'Increment 2',
            child: Text("+2"),
          ),
          FloatingActionButton(
            onPressed: () {
              bloc.increment.add(1);
            },
            tooltip: 'Increment 1',
            child: Text("+1"),
          ),
        ],
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Flutter 中使用 Stream/Sink 的相关文章

随机推荐

  • OpenSSL的EVP是什么意思?

    OpenSSL的EVP是什么意思 我知道它是 OpenSSL 中的一个更高级别的加密接口库 但是字母 E V P 代表什么 谢谢 陈兹 有趣的问题 我不确定 但是 ifndefevp h 顶部是 ifndef HEADER ENVELOPE
  • PHP/HTML 添加删除按钮

    我有下面的代码来从数据库中检索行 其中用户名列与基本目录名称匹配 username basename dirname FILE username mysql real escape string username result mysql
  • Android 添加新日历

    我已经检查了所有从 Android 应用程序中创建新日历的方法 我见过的唯一方法是在最新的 api 版本中使用新的 Calendar API 但这似乎只有在您使用时才有效CalendarContract ACCOUNT TYPE LOCAL
  • Java中如何做系统捷径跨平台集成?

    您可能知道 Mac OS X 中保存的快捷键是Cmd S在 Windows 上是Ctrl S 关闭应用程序的捷径是Cmd QWindows 是Alt F4 但问题是如何在 java 应用程序中执行这些操作 我是否需要找到我在应用程序中使用的
  • 将 Swift 类添加到具有多个目标的 Objective-C 项目

    我有一个现有的 Obj C 项目 其中包含许多共享相同 AppDelegate 的目标 我想桥接一个由选定目标使用的快速类 当我有一个目标时 我可以轻松地做到这一点 当我向项目添加 swift 文件时 我选择所需的目标并生成必要的 brid
  • 警告:mysqli_real_escape_string() 需要 2 个参数,其中 1 个给定...我做错了什么? [复制]

    这个问题在这里已经有答案了 我尝试使用 php 登录 但收到此错误 Warning mysqli real escape string expects exactly 2 parameters 1 given 我做错了什么 注册 php
  • 如何生成接口的swagger文档?

    我已经用谷歌搜索过它 但是 swagger 文档的所有示例都使用类 我想包括接口 因为读者对 API 而不是实现感兴趣 这是我的代码 包含所需的 Maven 依赖项
  • 如何在 Laravel 中存储非 php 文件的模板?

    我们可以存储PHP模板文件使用bladeLaravel 中的模板引擎 但是 我想在远程服务器上创建一个配置文件 每个文件包含 20 30 行以上 到目前为止 我一直在使用Perl 我曾经执行 Perl 文件 该文件用于将内容转储到一个文件中
  • 使用 UICollectionViewFlowLayout 重新排列 UICollectionView 的不同大小的项目

    假设我有一个带有 UICollectionViewFlowLayout 的 UICollectionView 并且我的项目大小不同 所以我已经实施了collectionView layout sizeForItemAt 现在假设我允许用户重
  • 了解 Beautiful Soup 中的 Find() 函数

    我知道我想做的事情很简单 但这让我感到悲伤 我想使用 BeautifulSoup 从 HTML 中提取数据 为此 我需要正确使用 find 功能 这是我正在使用的 HTML div class audit div class profile
  • 根据另一个数据框中的数据量删除一个数据框中的行

    我有两个 pandas 数据框A and B B是 A 的子集 我想删除 A 中的所有数字 如果 B 中存在该数字 But 如果一个数字在 A 中出现两次 在 B 中出现 1 次 那么它只会从 A 中删除该数字的 1 次出现 这是我的示例数
  • 在 Visual Studio Code 中找不到“调试:评估”的 CommandID

    我想在 Visual Studio Code 中添加命令 调试 评估 的键盘快捷键 不幸的是 命令 调试 评估 的命令 ID 没有记录 有人知道在哪里可以找到 commandId 吗 editor debug action selectio
  • 对周围的所有 Node JS 框架/库等感到困惑 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我感觉有点困惑 有很多 Node js 相关 东西 的框架 有人能给我一个概述吗 以下库 框架 其他内容如何相互关联 交互 其中包括什么或
  • Sikuli 积分器 C#

    我想在 C 中使用 Sikuli Integrator 我以管理员身份运行 VS 通过 NuGet 管理器安装 Sikuli Integrator 并想在简单任务上测试他 这是我的代码 using SikuliModule using Sy
  • 创建因子时设置级别与 `levels()<-`

    让我们首先创建一些因素 F1 lt factor c 1 2 20 10 25 3 F2 lt factor paste0 F1 years F3 lt F2 levels F3 lt paste0 sort F1 years F4 lt
  • Zurb Foundation:半透明顶栏可能吗?

    有没有办法用 Zurb Foundation 制作一个半透明的顶栏 据我所知 我已经在我的 settings scss file topbar bg color topbar bg topbar dropdown bg topbar dro
  • C#:将字符串编组为 utf8 char* [重复]

    这个问题在这里已经有答案了 背景 我正在尝试基于修改后的 libspotify net 编写一个高级 libspotify 包装器 http libspotifydotnet codeplex com http libspotifydotn
  • Php - 您的 PHP 安装似乎缺少 WordPress 所需的 MySQL 扩展

    如何修复下面的错误 您的 PHP 安装似乎缺少 WordPress 所需的 MySQL 扩展 我使用带有 telnet 连接的 NAS 我安装了FFP 0 7 My php ini is in ffp etc php ini我取消了我认为有
  • 更改 WPF Toolkit 图表中绘图区域和标题周围的边距

    我正在使用 WPF Toolkit 2010 年 2 月版本的 Chart 控件 图表相对于绘图区域占用了大量空间 如何控制绘图区域和图表标题周围的边距 这样 我可以将我需要的 10 个图表排列在网格中 而无需在屏幕上使用太多空间 Than
  • 在 Flutter 中使用 Stream/Sink

    我正在尝试更换increment颤动应用程序代码 通过使用Streams http www dartlang cc docs tutorials streams 来自 Dart API 而不使用范围模型 https pub dartlang