【问题标题】:How to use a Future in a StreamBuilder in Flutter [duplicate]如何在 Flutter 的 StreamBuilder 中使用 Future [重复]
【发布时间】:2020-12-11 13:22:59
【问题描述】:
我正在尝试使用 Flutter 和 Firebase 构建我的第一个移动应用程序。
-
错误:
参数类型“Future Function()”不能分配给参数类型“String”
class ShowUserData extends StatefulWidget {
@override
_ShowUserDataState createState() => _ShowUserDataState();
}
class _ShowUserDataState extends State<ShowUserData> {
final email = () {
final userEmail =
FirebaseAuth.instance.currentUser().then((user) => user.email);
print('userEmail + $userEmail');
return userEmail;
};
@override
Widget build(BuildContext context) {
return StreamBuilder(
// stream: user.getUserData().asStream(),
stream: Firestore.instance.collection('users').document(email).snapshots(),
builder: (context, snapshot) {
if (!snapshot.hasData) {
return Text("Loading");
}
print('snapshot + $snapshot');
var userDocument = snapshot.data;
print('userDocument + $userDocument');
return Text(userDocument['firstName']);
});
}
}
【问题讨论】:
标签:
string
flutter
google-cloud-firestore
future
stream-builder
【解决方案1】:
对于代码的第一部分,请考虑以下内容:
Future<String> getUserEmail() async {
final userEmail =
FirebaseUser user = await FirebaseAuth.instance.currentUser();
String userEmail = user.email;
print('userEmail + $userEmail');
return userEmail;
};
这应该可以解决该错误(因此回答您的问题)。尽管其余代码仍然会失败。你应该阅读futures and async programming。
现在我为整个事情建议的解决方案。
由于您有 2 个不同的异步源来创建流,因此您可能需要考虑创建自己的流! (是的,流就是这样强大的)。
按顺序,你想要
- 等待未来:.currentUser()
- 使用结果创建您的 Firestore 快照流
试试这样的
class ShowUserData extends StatefulWidget {
@override
_ShowUserDataState createState() => _ShowUserDataState();
}
class _ShowUserDataState extends State<ShowUserData> {
Stream currentUserStream() async* {
FirebaseUser user = await FirebaseAuth.instance.currentUser();
String userEmail = user.email;
yield* Firestore.instance.collection('users').document(userEmail).snapshots();
};
@override
Widget build(BuildContext context) {
return StreamBuilder(
// stream: user.getUserData().asStream(),
stream: currentUserStream(),
builder: (context, snapshot) {
if (!snapshot.hasData) {
return Text("Loading");
}
print('snapshot + $snapshot');
var userDocument = snapshot.data;
print('userDocument + $userDocument');
return Text(userDocument['firstName']);
});
}
}