Flutter-如何在没有 RxDart 的情况下从 Stream<String> 获取最后一个值?

Posted

技术标签:

【中文标题】Flutter-如何在没有 RxDart 的情况下从 Stream<String> 获取最后一个值?【英文标题】:Flutter- How to get last value from Stream<String> without RxDart? 【发布时间】:2019-06-16 00:31:06 【问题描述】:

需要知道我是否可以在不使用第三方库的情况下从 Stream 中获取最后一个值。

我尝试的第一种方法是,当我可以将值发送到“changeEmail”中的流时,我可以将 newValue 存储在 BLoC 中的某个变量中。对吗?

我尝试的第二种方法是添加一个侦听器,它也将完成与上述相同的工作,我需要将 newValue 存储在某个变量中。

我有 SteamController:

final _emailController = StreamController&lt;String&gt;.broadcast();

有 gitters:

Stream<String> get email => _emailController.stream; // getting data from stream

get changeEmail => _emailController.sink.add; // sending data to stream

【问题讨论】:

我认为最好使用rxdart。如果没有它提供的所有转换器,有许多用例会很麻烦。 是的,确实如此,但我想知道 Google 希望开发人员如何解决 rxdart 是第三方等问题。所以你认为将最后一个值存储在单独的变量中很好吗? 我想我会构建一个包装或扩展 Stream 的类,以便它以可重用的方式提供此功能(就像 rxdart 一样;-))。 【参考方案1】:

你不能直接这样做。要从流中获取最后一个值,您需要先完成流或缓存添加到流中的每个最后一个值。

//close the stream and get last value:
streamController1 = new StreamController();
streamController1.add("val1");
streamController1.add("val2");
streamController1.add("val3");
streamController1.close();
streamController1.stream.last.then((value) => print(value)); //output: val3

//caching the added values:
streamController1 = new StreamController.broadcast();
String lastValue;
streamController1.stream.listen((value) 
  lastValue = value;
);
streamController1.add("val1");
streamController1.add("val2");
streamController1.add("val3");
Future.delayed(Duration(milliseconds: 500), ()=> print(lastValue)); //output: val3

【讨论】:

【参考方案2】:

您的 sn-ps 大多是正确的。但是,您需要在_emailController.sink.add 上提供电子邮件

final _emailController = StreamController<String>();

// Stream that will be called on the UI screen
Stream<String> get email => _emailController.stream;

fetchEmail() async 
  String email = // email that will be provided to your Stream
  _emailController.sink.add(email);


dispose() 
  _emailController.close();

这是我之前创建的sample,它在不使用 rxdart 的情况下实现了 BLoC。

【讨论】:

不幸的是,这并没有回答问题,只是更正了给出的例子。

以上是关于Flutter-如何在没有 RxDart 的情况下从 Stream<String> 获取最后一个值?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 中的 rxdart 使用未被识别

Flutter 使用流“RxDart”提交登录 Bloc

Flutter状态管理:RxDart

Flutter状态管理:RxDart

如何在不使用任何库的情况下在颤振中使用 bloc

如何在没有主机的情况下启动我的 Flutter 应用程序?