如何在流到达 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()),
...
),
我想在流到达 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()),
...
),