0

我正在使用 StreamBuilder 从 firestore 流式传输数据。

StreamBuilder<QuerySnapshot>(
    stream:  _firestore.collection('meals').where('email', isEqualTo: loggedInUser.email).orderBy('date', descending: true).snapshots(),

如果我取出.where流的一部分,它会将所有数据返回到设备。完成此操作后,我可以将.where部分放回原处,它工作正常。但是,它不会立即起作用。这表明该.where部分仅在缓存已经有数据时才有效。此外,如果我使用 Firestore 控制台添加文档,它不会使用新数据更新应用程序。但是由于某种原因,如果我删除该部分,它将显示所有更新的文档.where

我真的很困惑。有任何想法吗?

谢谢杰森

更新:我现在想出了如何解决这个问题。请参阅下面的答案,了解我是如何解决的。

4

1 回答 1

1

我终于找到了我的问题的答案。

我添加queryUserData();initState(). 下面是它在代码中的样子:

class HomeScreen extends StatefulWidget {
  static const String id = 'home_screen';

  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {

  final _firestore = Firestore.instance;
  final _auth = FirebaseAuth.instance;
  FirebaseUser loggedInUser;

  @override
  void initState() {
    super.initState();
    getCurrentUser();
    queryUserData();
  }

  void getCurrentUser() async {
    try {
      final user = await _auth.currentUser();
      if (user != null) {
        loggedInUser = user;
        print('this is a test${loggedInUser.email}');
      }
    } catch (e) {
      print(e);
    }
  }

  void queryUserData() async {
    final user = await _auth.currentUser();
    loggedInUser = user;
    final query = await _firestore.collection('meals').orderBy('date', descending: true).where('email', isEqualTo: '${loggedInUser.email}').getDocuments(source: Source.cache);
    var totalEquals = query.documents.length;
    print('$totalEquals records found for this user');

    if (totalEquals >= 1) {
      print(query);
      print('cache has data. Therefore data will now only be read from cache');
    } else {
      print('data will be read from firestore until you have at least 1 meal');
      getFirestoreInitialData();

    }
  }

  void getFirestoreInitialData() async {
    final query = await _firestore.collection('meals').getDocuments();
    print(query);
    print('data still being read from firestore');
  }
于 2020-04-03T06:18:19.140 回答