Как заставить Flutter-провайдера notifyListeners () с завода?

У меня есть провайдер класса Auth. Когда приложение загружается, я вызываю API, который возвращает json с данными, которые я сопоставляю с классом Auth с помощью фабричного метода (Auth.fromJson). После завершения сопоставления я хочу уведомить слушателей, чтобы обновился соответствующий пользовательский интерфейс. Получается, что я не могу вызвать notifyListeners () из конструктора фабрики, потому что получаю эту ошибку:

к членам экземпляра нельзя получить доступ из конструктора фабрики

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

class Auth with ChangeNotifier {
  String token;
  String organisationId;
  String domain;
  String userId;

  Auth(
      {this.token,
      this.organisationId,
      this.domain,
      this.userId});

  factory Auth.fromJson(Map<String, dynamic> json) {
    Auth(
      token: json['token'],
      organisationId: json['organisationId'],
      domain: json['domain'],
      userId: json['userId'],
    );
    notifyListeners(); // Error here. 
    return Auth();
  }
}

person Eden WebStudio    schedule 13.12.2019    source источник
comment
Вы пытаетесь уведомить слушателей объекта Auth немедленно после создания объекта. Какие слушатели у него будут к этому моменту?   -  person Abion47    schedule 14.12.2019


Ответы (1)


  1. фабричные методы очень похожи на статические методы. То, как вы не можете получить доступ к переменным и методам класса, применимо и к factory.
  2. notifyListeners (); является методом класса ChangeNotifier, поэтому вы не можете получить к нему доступ с помощью каких-либо статических или фабричных методов.
  3. Вам понадобится экземпляр Auth для вызова notifyListeners ();
  4. Лучше не делать Auth as ChangeNotifier, если вы действительно хотите наблюдать за изменением Auth, а затем создать ChangeNotifer, который содержит значение Auth. Ниже приведен код для этого.

import 'package:flutter/material.dart';

class Auth{
  String token;
  String organisationId;
  String domain;
  String userId;

  Auth(
      {this.token,
      this.organisationId,
      this.domain,
      this.userId});

  factory Auth.fromJson(Map<String, dynamic> json) {
    return Auth(
      token: json['token'],
      organisationId: json['organisationId'],
      domain: json['domain'],
      userId: json['userId'],
    ); 
  }
}

class AuthChangeNotifier  with ChangeNotifier {
  Auth auth;
  onNewAuth(Auth newAuth){
    this.auth = newAuth;
    notifyListeners();
  }
}
  1. Вы также можете использовать ValueNotifier<Auth> для этого варианта использования и наблюдать за ним с помощью ValueListenableBuilder<Auth>

Надеюсь, это поможет, дайте мне знать, если у вас есть сомнения.

person Kalpesh Kundanani    schedule 14.12.2019
comment
Спасибо. Итак, откуда я мог бы вызвать onNewAuth, чтобы передать newAuth? Я вызвал Auth.fromJson в обработчике ответа http. Я предполагаю, что когда это вернется, я смогу затем вызвать AuthChangeNotifier.onNewAuth, передав ранее возвращенный экземпляр Auth ...? - person Eden WebStudio; 14.12.2019
comment
У вас есть существующая авторизация - ›Вы получаете новую авторизацию от вашего api -› анализируете ее из JSON - ›передаете ее ChangeNotifier -› все слушатели получат новый экземпляр auth. Вот и все. - person Kalpesh Kundanani; 14.12.2019
comment
@KalpeshKundanani В приведенном выше примере вы можете объяснить, как передать его ChangeNotifier? - person dwax; 10.02.2020
comment
Я создал метод onNewAuth, поэтому я могу передать его ChangeNotifier - person Kalpesh Kundanani; 10.02.2020