【问题标题】:Flutter FutureBuilder with FirestoreFlutter FutureBuilder 与 Firestore
【发布时间】:2020-07-03 11:25:27
【问题描述】:

我正在尝试在颤振中创建一个列表,为每个单元格从 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');
        });
  }

数据库服务中的AND:

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

【问题讨论】:

    标签: firebase flutter future


    【解决方案1】:

    尝试如下重构您的代码。

    您没有等待响应,因此未来返回 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;
        });
    }
    

    【讨论】:

    • 但是我不建议同时使用 .then() 和 async await,等待并将 .get() 结果分配给一个变量,该变量将保存来自 firebase 的响应(确切地说,它的值是userJSON 在这种情况下)
    • 谢谢。你是对的,因此我已经切换到使用流并使用 firestore 快照观察其中的 userDetails。
    猜你喜欢
    • 2018-11-23
    • 2020-09-26
    • 1970-01-01
    • 2019-10-03
    • 1970-01-01
    • 2021-07-19
    • 2019-10-27
    • 2021-03-15
    • 1970-01-01
    相关资源
    最近更新 更多