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;
    });
}