【发布时间】:2021-02-04 19:40:06
【问题描述】:
我想在流到达 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...');
});
}
}
【问题讨论】:
-
使用
Stream.map方法,比如var mapped = countDown().map((i) => i.toString());现在可以使用stream: mapped -
谢谢@pskink。我的实际用例是将 json 从 Firestore 转换为我的本地模型。我想在我的 ViewModel 中进行转换,而不是在 Flutter View 代码中使用 json,如果这有意义的话
-
这就是为什么我写了
var mapped = countDown().map((i) => i.toString());而不是stream: countDown().map((i) => i.toString()),- 只需调用map方法来获取你的firestoreStream(块,提供者等) - 换句话说:映射你的firestoreStream变成另一个Stream -
啊。完美的。谢谢!
标签: flutter dart stream-builder