#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. Согласен, мне тоже не нравится это решение. Но это единственное, что я могу придумать.