Flutter FutureBuilder 与 Firestore
Flutter FutureBuilder with Firestore
我正在尝试在 flutter 中创建一个列表,从 firestore 为每个单元格异步加载数据:
Future getUserDetails(String userID) async {
DatabaseService databaseService =
DatabaseService(currentUserId: _currentUserID);
return databaseService.getUserDetails(userID: userID);
}
Future sampleText() async {
return Future.delayed(Duration(seconds: 3)).then((value) => randomString(5));
}
FutureBuilder _userAsyncCell(ClassAttendee attendeeData) {
return FutureBuilder(
future: getUserDetails(attendeeData.userId),//sampleText(),
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.connectionState == ConnectionState.waiting)
return Center(child: CircularProgressIndicator());
else if (snapshot.hasData)
return Text("DATA: ${snapshot.data}");
else if (snapshot.hasError)
return Text("ERROR: ${snapshot.error}");
else
return Text('None');
});
}
并且在数据库服务中:
final CollectionReference _usersCollection =
Firestore.instance.collection('users');
Future<User> getUserDetails({String userID}) async {
print('Fetching User public data ${userID}');
_usersCollection.document(userID).get().then((userJSON) {
User user = User.fromJson(userJSON.data);
print("Received user info: ${user.identifier}");
return user;
});
}
问题是在 futureBuilder 中接收到的数据总是 nil。
当使用 sampleText()
而不是 getUserDetails()
时,它工作正常。
你知道为什么会这样吗?
编辑:
在日志中我可以看到,userDetails 正在正确返回值并且 futureBuilder 的构建器被称为:
flutter: Fetching User public data Rh8snwoI27V6pA3wkmQwBPitgl63
flutter: Received user info: Rh8snwoI27V6pA3wkmQwBPitgl63
尝试按如下方式重构您的代码。
您不是在等待响应,因此未来 returns 具有 nil
值
Future<User> getUserDetails({String userID}) async {
print('Fetching User public data ${userID}');
await _usersCollection.document(userID).get().then((userJSON) {
User user = User.fromJson(userJSON.data);
print("Received user info: ${user.identifier}");
return user;
});
}
我正在尝试在 flutter 中创建一个列表,从 firestore 为每个单元格异步加载数据:
Future getUserDetails(String userID) async {
DatabaseService databaseService =
DatabaseService(currentUserId: _currentUserID);
return databaseService.getUserDetails(userID: userID);
}
Future sampleText() async {
return Future.delayed(Duration(seconds: 3)).then((value) => randomString(5));
}
FutureBuilder _userAsyncCell(ClassAttendee attendeeData) {
return FutureBuilder(
future: getUserDetails(attendeeData.userId),//sampleText(),
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.connectionState == ConnectionState.waiting)
return Center(child: CircularProgressIndicator());
else if (snapshot.hasData)
return Text("DATA: ${snapshot.data}");
else if (snapshot.hasError)
return Text("ERROR: ${snapshot.error}");
else
return Text('None');
});
}
并且在数据库服务中:
final CollectionReference _usersCollection =
Firestore.instance.collection('users');
Future<User> getUserDetails({String userID}) async {
print('Fetching User public data ${userID}');
_usersCollection.document(userID).get().then((userJSON) {
User user = User.fromJson(userJSON.data);
print("Received user info: ${user.identifier}");
return user;
});
}
问题是在 futureBuilder 中接收到的数据总是 nil。
当使用 sampleText()
而不是 getUserDetails()
时,它工作正常。
你知道为什么会这样吗?
编辑:
在日志中我可以看到,userDetails 正在正确返回值并且 futureBuilder 的构建器被称为:
flutter: Fetching User public data Rh8snwoI27V6pA3wkmQwBPitgl63
flutter: Received user info: Rh8snwoI27V6pA3wkmQwBPitgl63
尝试按如下方式重构您的代码。
您不是在等待响应,因此未来 returns 具有 nil
值
Future<User> getUserDetails({String userID}) async {
print('Fetching User public data ${userID}');
await _usersCollection.document(userID).get().then((userJSON) {
User user = User.fromJson(userJSON.data);
print("Received user info: ${user.identifier}");
return user;
});
}