【问题标题】:How can I get data using provider?如何使用提供程序获取数据?
【发布时间】:2021-02-24 19:07:23
【问题描述】:

我正在使用提供商实现登录,但我没有在仪表板页面上获取数据。 模型类

class LoginModel {
Data data;
int status;
String message;

LoginModel({this.data, this.status, this.message});

LoginModel.fromJson(Map<String, dynamic> json) {
data = json['data'] != null ? new Data.fromJson(json['data']) : null;
status = json['status'];
message = json['message'];
}

Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.data != null) {
  data['data'] = this.data.toJson();
}
data['status'] = this.status;
data['message'] = this.message;
return data;
 }
}

 class Data {
  String customerId;
  String customerMobileNo;
  String customerToken;
  String otp;

  Data({this.customerId, this.customerMobileNo, this.customerToken, this.otp});

  Data.fromJson(Map<String, dynamic> json) {
   customerId = json['customerId'];
   customerMobileNo = json['customerMobileNo'];
  customerToken = json['customerToken'];
  otp = json['otp'];
 } 

 Map<String, dynamic> toJson() {
  final Map<String, dynamic> data = new Map<String, dynamic>();
  data['customerId'] = this.customerId;
  data['customerMobileNo'] = this.customerMobileNo;
  data['customerToken'] = this.customerToken;
  data['otp'] = this.otp;
  return data;
  }
 }
 

提供者类

class AuthProvider extends ChangeNotifier {
Future<LoginModel> generateOTP(String mobileNumber) async {
var result;
Response response = await post(
  AppUrl.login,
  body: {
    'mobileNo': mobileNumber,
  },
);
if(response.statusCode==200) {
  final responseData = json.decode(response.body);
  var userData = responseData['data'];
  print(responseData);
  LoginModel authUser = LoginModel.fromJson(userData);
  notifyListeners();
}
else {
  print("Something went wrong");
}
return result;
}
}

显示页面

 class Dashboard extends StatelessWidget {
 @override
 Widget build(BuildContext context) {
 final userTest = Provider.of<AuthProvider>(context);
 return Scaffold(
   body: Center(
    child: ListView(
      shrinkWrap: true,
      children: [
               Text(userTest.authUser.data.customerToken),
            ],
          ),
        ),
      );
    }

错误

在处理手势时引发以下 NoSuchMethodError: 在 null 上调用了 getter 'customerToken'。 接收方:空 尝试调用:customerToken

如何访问 LoginModel 类的属性。任何人都可以解决我的问题请帮助我,我尝试了很多但我无法获得价值。

【问题讨论】:

    标签: flutter dart flutter-provider


    【解决方案1】:
    1. 您无法使用普通的 Future 函数通知您的听众(不过,我不确定,因为您没有提供提供程序类的完整代码)。您必须将您的 generateOTP() 函数放在 类中,这将帮助您在需要时通知您的侦听器,并将其范围限定为您的小部件。
    2. 您收到此错误是因为您没有将令牌存储在任何地方,或者您没有在使用存储令牌之前调用它。因此,首先,请尝试存储您的令牌并在使用前调用它。

    【讨论】:

    • 我将generateOTP() 函数放在extendsChangeNotifier 的类中,但我没有在示例代码中提及。
    • @Jorden,那么您在使用令牌之前并没有调用它。我希望您将令牌存储在本地存储中,然后在使用前调用它。根据您的问题,要访问您的模型,首先将 authuser(LoginModel 的实例)设为全局 AuthProvider 类并返回您的 authUser 而不是结果。愿它帮助你。谢谢。
    【解决方案2】:
    1. LoginModel authUser = LoginModel.fromJson(userData); 您正在将值初始化为方法变量 LoginModel authUser 而不是类变量 authUser 尝试从 'authUser' 之前删除 LoginModel
    2. Dashboard 中,您还应该检查null 值,您可以这样做userTest?.authUser?.data?.customerToken ?? ''

    【讨论】:

      猜你喜欢
      • 2021-10-01
      • 2019-01-23
      • 2020-02-08
      • 1970-01-01
      • 1970-01-01
      • 2020-01-30
      • 1970-01-01
      • 2021-06-07
      • 1970-01-01
      相关资源
      最近更新 更多