如何通过对uid的异步调用从Firebase查询数据

时间:2019-09-15 07:17:50

标签: firebase flutter future

我正在尝试获取属于已登录用户的数据,但是由于某种原因,“ getuserui”是异步的。即使用户登录后可以在应用程序内执行操作,该函数仍会返回Future。...

我已经不知道自己尝试了多少种不同的东西,包括.then之类的东西,但这是我最近的尝试。

 @override
  Widget build(BuildContext context) {
    return SizedBox(
      height: 900,
      child: StreamBuilder(
          stream: () async{
            fireFirestore.instance.collection('properties').where('uid', isEqualTo: await _authService.getUserId()) .snapshots(),
          }, 
          builder: (BuildContext context, AsyncSnapshot snapshot) {
            if (!snapshot.hasData)
              return const Text('Loading...');
            else {
              return ListView.builder( ...............

如果您需要查看getUserId():

Future<String> getUserId() {
    return _auth.currentUser().then((value) => value.uid.toString());
  }

(我已经在以后的方式(.then)和异步方式(异步等待)中使用了此方法

它只是告诉我the argument type Future<null> can't be assigned to the parameter type Stream

1 个答案:

答案 0 :(得分:2)

首先,您将异步函数作为流传递,因此出现了错误。其次,您需要将StreamBuilder包装在FutureBuilder中,因为它取决于将来的_authService.getUserId()

@override
Widget build(BuildContext context) {
  return SizedBox(
    height: 900,
    child: FutureBuilder(
      future: _authService.getUserId(),
      builder: (context, snapshot) {
        if(snapshot.hasData) 
        return StreamBuilder(
          stream: fireFirestore.instance.collection('properties').where('uid', isEqualTo: snapshot.data) .snapshots(),
          builder: (context, snapshot) {
            ...
          },
        );

        return Text('future had no data');
      },
    ),
  );
}