dart - 如何使 Sink 格式化 Stream 的结果?

在 google IO 18 中,Flutter 演示者展示了一个功能,但没有展示如何实现它。 视频(准确时间)是:https://youtu.be/RS36gBEp8OI?t=1776

如何实现这样的事情?如何根据接收器正确地使流正确格式化?

(对不起,我对 Rx 不太熟悉)

最佳答案

使用 rxdart 包中的 combineLatest 函数。它采用输入流的最新值,因此只要语言环境或购物车项目发生变化,它就会计算并格式化总成本。

import 'dart:async'; // Sink, Stream
import 'dart:ui'; // Locale
import 'package:rxdart/rxdart.dart'; // Observable, *Subject

class Bloc {
  var _locale = BehaviorSubject<Locale>(seedValue: Locale('en', 'US'));
  var _items = BehaviorSubject<List<CartItem>>(seedValue: []);
  Stream<String> _totalCost;

  Sink<Locale> get locale => _locale.sink;
  Stream<List<CartItem>> get items => _items.stream;
  Stream<String> get totalCost => _totalCost;

  Bloc() {
    _totalCost = Observable.combineLatest2<Locale, List<CartItem>, String>(
        _locale, _items, (locale, items) {
      // TODO calculate total price of items and format based on locale
      return 'USD 10.00';
    }).asBroadcastStream();
  }

  void dispose() {
    _locale.close();
    _items.close();
  }
}

免责声明:我没有尝试运行此代码,因此可能会出现错误,但基本思想应该是可靠的。

关于dart - 如何使 Sink<Locale> 格式化 Stream<String> 的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52340948/

相关文章:

flutter - Flutter 中的约束布局等价物是什么?

android - Flutter - 多个手势,无需抬起手指

firebase - flutter |如何将数据添加到 Firestore 中的现有文档

dart - 如何使用现有的应用程序 keystore 获取签名的 apk?

dart - 使用 Flutter 进行底部导航

dart - 如何删除 RadioListTile 上的内部填充,以便可以连续使用 3 个 Radi

firebase - Flutter ListView 跳转到顶部

firebase - 如何在 Flutter 中设置不同的 firebase 环境

android - Flutter中如何解析json数据并显示在Listview中?

java - 在 Flutter 应用程序中使用 Java 或其他语言