Поставщик сохраняет данные после выхода из системы

#flutter

#flutter

Вопрос:

На моем первом экране я получаю данные из Firebase и сохраняю их в provider. Эти данные будут использоваться на другом экране.

   @override
  void initState() {
    super.initState();
    FirestorePreviousPage.documentsListDescending().then((query) {
      final totalHisabProvider = Provider.of<TotalHisab>(context, listen: false);
      totalHisabProvider.addItemsFromSnapshot(query);

      final unpaidHisabProvider = Provider.of<UnpaidHisab>(context, listen: false);
      unpaidHisabProvider.addItems(query);

      final paidHisabProvider = Provider.of<PaidHisab>(context, listen: false);
      paidHisabProvider.addItems(query);
    });
  }
  

Метод documentsListAscending:

   static Future<QuerySnapshot> documentsListDescending() async {
    final user = await CurrentUser.getCurrentUser();

    return await Firestore.instance
        .collection(user.uid)
        .orderBy('serverTimestamp', descending: true)
        .getDocuments();
  }
  

Мой метод выхода из системы:

   static Future<void> logout(BuildContext context) async {

    await FirebaseAuth.instance.signOut();

    Navigator.of(context).pushNamedAndRemoveUntil(
      WelcomeScreen.routeName,
      (Route<dynamic> route) => false,
    );
  }
  

Теперь, когда я выхожу из системы и вхожу в систему с другим пользователем, этот новый пользователь по-прежнему имеет доступ к данным предыдущего пользователя. Теперь я думаю, что понимаю эту часть. Пока приложение работает, оно будет сохранять данные в управлении состоянием.

Но почему не извлекаются новые данные из Firebase? Разве эта строка не должна обновлять данные с новым идентификатором пользователя: .collection(user.uid)

У меня есть идея, как это решить. Просто очистите данные во всех поставщиках в методе выхода из системы. Но это не кажется правильным. Сначала мне нужно понять, почему он не работает.

Комментарии:

1. очистите локальные экземпляры, а также присвоите значения null

2. Сначала проверьте, получаете ли вы обновленные данные из firebase при втором входе в систему. Затем проверьте, правильно ли вы назначаете их своим поставщикам. Проверьте должным образом, и вы наверняка узнаете что-то новое..

Ответ №1:

В итоге я очистил поставщиков вручную:

   static Future<void> logout(BuildContext context) async {
    await FirebaseAuth.instance.signOut();

    // Clear all providers
    Provider.of<Cart>(context, listen: false).clear();
    Provider.of<UnpaidHisab>(context, listen: false).clear();
    Provider.of<PaidHisab>(context, listen: false).clear();
    Provider.of<TotalHisab>(context, listen: false).clear();

    Navigator.of(context).pushNamedAndRemoveUntil(
      WelcomeScreen.routeName,
      (Route<dynamic> route) => false,
    );
  }
  

Насколько я могу судить, это работает просто отлично.

Комментарии:

1. Я не думаю, что это лучший подход. Есть ли какое-либо хорошее решение для этого?

2. Согласен, мне тоже не нравится это решение. Но это единственное, что я могу придумать.