Сбросить данные провайдера - Flutter
Я использую в своем приложении мультипровайдера. Провайдер работает отлично, хранит данные и обеспечивает идеальные события, когда что-то меняется.
Теперь у меня в приложении есть этот сценарий ->
Пользователь 1 вошел в систему. Теперь, когда я добавляю вторую учетную запись в тот же логин (например, Gmail - Multi-Account), провайдеры возвращают мне более старые значения.
Я пробовал искать обнуляющие значения провайдеров, но не смог найти ничего связанного с этим.
Пробовал, но не получилось:
- Создал новый объект провайдеров для сброса.
Provider.of<LoginProvider>(context).dispose();
3 ответа
Чтобы обновить значение Provider, вы можете вызвать его с помощью .value()
конструктор и используйте переменную, зависящую от состояния.
class SomeWidgetState extends State<SomeWidget> {
Logins logins = [];
void addLogin(Login newLogin) {
setState((){
logins = [...logins, newLogin];
});
}
@override
Widget build(BuildContext context) {
return Provider.value(
value: logins,
child: OtherWidget(),
);
}
При звонке addLogin
зарегистрированное значение в Provider будет обновлено.
Я нашел обходной путь. Чтобы восстановить значения по умолчанию при инициализации экрана, выполните следующие действия. В состоянии инициализации присвойте значениям поставщика значения по умолчанию.
void initState() {
Future.delayed(Duration.zero, () {
final musicProvider = Provider.of<MusicProvider>(context, listen: false);
final artistProvider =
Provider.of<ArtistProvider>(context, listen: false);
final localGuestlist =
Provider.of<LocalGuestlistProvider>(context, listen: false);
final aboutProvider = Provider.of<AboutProvider>(context, listen: false);
///Resttings the value of list with clear method
musicProvider.clearMusic();
artistProvider.clearList();
///Resetting the to default values
localGuestlist.updateGuestlistLimit = 140;
localGuestlist.updateClosingTime = TimeOfDay(hour: 20, minute: 0);
aboutProvider.updateAbout = '';
});
super.initState();
}
Ответ Каушала был полезен, но я внес некоторые изменения.
Мой провайдер:
class BillsProvider with ChangeNotifier {
double _balance = 0;
double get balance => _balance;
void balanceNotifier(List<double> costs) {
if (costs.isEmpty)
_balance = 0;
else {
_balance = costs.fold<double>(
0, (previousValue, element) => previousValue + element);
}
notifyListeners();
}
}
На странице:
class _PageState extends State<Page> {
//Declaration of the variable.
BillsProvider? billsProvider;
@override
void initState() {
Future.delayed(Duration.zero, () {
//Initialize the variable.
billsProvider = Provider.of<BillsProvider>(context, listen: false);
//Call the setter and send an empty list.
billsProvider?.balanceNotifier([]);
});
super.initState();
}
...
}