Streambuilder 仅在首次启动应用程序时显示来自本地缓存的数据

Streambuilder only showing data from local cache on first launch of app

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

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

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

我真的很困惑。有什么想法吗?

谢谢杰森

更新:我现在想出了解决这个问题的方法。请在下面查看我的回答,了解我是如何解决它的。

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

我将 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');
  }