如何在流到达 StreamBuilder 之前对其进行转换?

How to convert a stream before it reaches StreamBuilder?

我想在流到达 StreamBuilder 之前对其进行转换,但不知道那会是什么样子。作为测试,我在下面创建了简单的倒计时。我想做的是将 CountDownConversion 提供给 StreamBuilder,但如果我取消注释,则会出现编译错误。我一直在阅读关于流和 StreamBuilder 的资料,但在 StreamBuilder 之前还没有看到任何人进行这种类型的转换。如果有人能给我提供线索,我将不胜感激。

import 'package:flutter/material.dart';

final Color darkBlue = Color.fromARGB(255, 18, 32, 47);

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData.dark().copyWith(scaffoldBackgroundColor: darkBlue),
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: Center(
          child: MyWidget(),
        ),
      ),
    );
  }
}

Stream<int> countDown() async* {
    int i = 42;
    while (true) {
      await Future.delayed(Duration(seconds: 1));
      yield i--;
      if (i == 0) break;
    }
  }

// Stream<String> countDownConverter() {
//   final number = countDown();
//   return number.toString();
// }

class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return StreamBuilder(
    stream: countDown(), // <- want countDownConverter() here
    builder: (context, snapshot) {
      if (snapshot.connectionState == ConnectionState.active) {
        final String count = snapshot.data.toString();
        return Text(count, style: Theme.of(context).textTheme.headline4);
      } else return Text('Working...');
    });
  }
}

也将 countDownConverter 转换为异步生成器并使用 await for 让它监听 countDown:

Stream<String> countDownConverter() async* {
  await for (int n in countDown()) {
    yield n.toString();
  }
}

虽然理想情况下,您可以简单地在流本身上使用 map 而不是编写转换方法:

StreamBuilder(
  stream: countDown().map((i) => i.toString()),
  ...
),