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<String>.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> 获取最后一个值?的主要内容,如果未能解决你的问题,请参考以下文章