如何使Flutter提供程序从工厂提供者notifyListeners()?

时间:2019-12-13 23:22:19

标签: flutter dart flutter-provider

我有一个Auth类的提供者。应用加载时,我调用一个API,该API返回带有数据的json,这些数据使用工厂方法(Auth.fromJson)映射到Auth类中。映射完成后,我希望通知侦听器,以便更新相关的UI。因此轮到我无法从工厂构造函数调用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();
  }
}

1 个答案:

答案 0 :(得分:0)

    工厂方法非常类似于静态方法。无法访问类变量和方法的方法也适用于工厂。
  1. notifyListeners();是ChangeNotifier类的一种方法,因此您不能通过任何静态方法或工厂方法来访问它。
  2. 您将需要Auth实例来调用notifyListeners();
  3. 更好的做法是,如果您真的想观察Auth中的更改,则不要将Auth更改为ChangeNotifier,然后制作一个保存Auth值的ChangeNotifer。以下是该代码。

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>
  2. 进行观察

希望有帮助,如果您有任何疑问,请告诉我。