Streambuilder показывает данные только из локального кэша при первом запуске приложения - PullRequest
0 голосов
/ 02 апреля 2020

Я использую StreamBuilder для потоковой передачи данных из firestore.

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

Если я извлекаю секцию .where потока, он возвращает все данные на устройство. Как только это будет сделано, я смогу снова вставить раздел .where, и он будет работать нормально. Тем не менее, это не работает сразу. Это предполагает, что раздел .where работает только после того, как в кеше уже есть данные Кроме того, если я добавляю документ с помощью консоли firestore, приложение не обновляет новые данные. Но по какой-то причине он покажет все обновленные документы, если я удалю часть .where.

Я действительно запутался. Есть идеи?

Спасибо, Джейсон

ОБНОВЛЕНИЕ: Теперь я понял, как решить эту проблему. Пожалуйста, посмотрите мой ответ ниже, как я решил это.

1 Ответ

1 голос
/ 03 апреля 2020

Я наконец-то понял ответ на мою проблему.

Я добавил 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');
  }
...