Сбросить данные провайдера - 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();
    }

    ...
}
Другие вопросы по тегам