【问题标题】:I am trying to get data from API but having error我正在尝试从 API 获取数据但出现错误
【发布时间】:2022-01-17 07:42:55
【问题描述】:

这是我的模型类,我正在尝试获取所有数据但出现错误并且不知道为什么。

HomePageModel homePageModelFromJson(String str) => HomePageModel.fromJson(json.decode(str));

String homePageModelToJson(HomePageModel data) => json.encode(data.toJson());

class HomePageModel with ChangeNotifier {
  HomePageModel({
    this.data,
  });

  List<Datum>? data;

  factory HomePageModel.fromJson(Map<String, dynamic> json) => HomePageModel(
    data: List<Datum>.from(json["data"]!.map((x) => Datum.fromJson(x))),
  );

  Map<String, dynamic> toJson() => {
    "data": List<dynamic>.from(data!.map((x) => x.toJson())),
  };
}

class Datum {
  Datum({
    this.schoolid,
    this.name,
    this.logo,
    this.address,
    this.contact,
    this.principalname,
    this.principalcontact,
    this.slogan,
    this.webAddress,
    this.description,
    this.email,
    this.pan,
    this.establishedYear,
  });

  String? schoolid;
  String? name;
  String? logo;
  String? address;
  String? contact;
  String? principalname;
  String? principalcontact;
  String? slogan;
  String? webAddress;
  String? description;
  String? email;
  String? pan;
  int? establishedYear;

  factory Datum.fromJson(Map<String, dynamic> json) => Datum(
    schoolid: json["schoolid"],
    name: json["name"],
    logo: json["logo"],
    address: json["address"],
    contact: json["contact"],
    principalname: json["principalname"],
    principalcontact: json["principalcontact"],
    slogan: json["slogan"],
    webAddress: json["web_address"] == null ? null : json["web_address"],
    description: json["description"] == null ? null : json["description"],
    email: json["email"],
    pan: json["pan"],
    establishedYear: json["established_year"],
  );

  Map<String, dynamic> toJson() => {
    "schoolid": schoolid,
    "name": name,
    "logo": logo,
    "address": address,
    "contact": contact,
    "principalname": principalname,
    "principalcontact": principalcontact,
    "slogan": slogan,
    "web_address": webAddress == null ? null : webAddress,
    "description": description == null ? null : description,
    "email": email,
    "pan": pan,
    "established_year": establishedYear,
  };
}

这就是我尝试获取数据的方式:

class HomePageModels with ChangeNotifier{
  List<HomePageModel> _hItem = [];

  List<HomePageModel> get hItem{
    return [..._hItem];
  }

  Future<void> getHomeData(BuildContext context) async{
    const url = "https://shikshyasoftware.com.np/CoreApplicationandAPIService-4617993073/api/school";
    try{
      // EasyLoading.show(status: 'Loading...');
      final response = await http.get(Uri.parse(url));
      final extractedData = json.decode(response.body);
      List<HomePageModel> loadedHomeData = [];
      if(extractedData == null){
        return;
      }
      if(response.statusCode == 200){
        print(extractedData);
      }
      extractedData.forEach((element){
        loadedHomeData.add(HomePageModel.fromJson(element));
      });
      _hItem = loadedHomeData;
      // EasyLoading.showSuccess("data fetched sucessfull");
      notifyListeners();
    }catch(e){
      rethrow;
    }
  }
}

但我收到错误:

[ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: type '(dynamic) => Null' is not a subtype of type '(String, dynamic) => void' of 'f'

【问题讨论】:

  • 如果您从 API 获取数据,请参考我的回答 hereherehere 希望对您有所帮助

标签: flutter api dart-null-safety


【解决方案1】:

问题在于您尝试解析数据的方式,您不需要遍历每个元素来解析它,在您的模型中只需使其返回这样的列表类型,

class HomePageModel with ChangeNotifier {
  List<Datum>? data;

  HomePageModel({this.data});

  HomePageModel.fromJson(Map<String, dynamic> json) {
    if (json['data'] != null) {
      data = <Datum>[];
      json['data'].forEach((v) {
        data!.add(new Datum.fromJson(v));
      });
    }
  }

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

class Datum {
  Datum({
    this.schoolid,
    this.name,
    this.logo,
    this.address,
    this.contact,
    this.principalname,
    this.principalcontact,
    this.slogan,
    this.webAddress,
    this.description,
    this.email,
    this.pan,
    this.establishedYear,
  });

  String? schoolid;
  String? name;
  String? logo;
  String? address;
  String? contact;
  String? principalname;
  String? principalcontact;
  String? slogan;
  String? webAddress;
  String? description;
  String? email;
  String? pan;
  int? establishedYear;

  Datum.fromJson(Map<String, dynamic> json) {
    schoolid = json["schoolid"];
    name = json["name"];
    logo = json["logo"];
    address = json["address"];
    contact = json["contact"];
    principalname = json["principalname"];
    principalcontact = json["principalcontact"];
    slogan = json["slogan"];
    webAddress = json["web_address"];
    description = json["description"];
    email = json["email"];
    pan = json["pan"];
    establishedYear = json["established_year"];
  }
  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['schoolid'] = this.schoolid;
    data['name'] = this.name;
    data['logo'] = this.logo;
    data['address'] = this.address;
    data['contact'] = this.contact;
    data['principalname'] = this.principalname;
    data['principalcontact'] = this.principalcontact;
    data['slogan'] = this.slogan;
    data['web_address'] = this.webAddress;
    data['description'] = this.description;
    data['email'] = this.email;
    data['pan'] = this.pan;
    data['established_year'] = this.establishedYear;
    return data;
  }
}

在您的视图模型中,您可以像这样解析从 response.body 中提取的数据,

class HomePageModels with ChangeNotifier {
  HomePageModel? _hItem;

  HomePageModel get hItem {
    return _hItem!;
  }

  Future<void> getHomeData(BuildContext context) async {
    const url =
        "https://shikshyasoftware.com.np/CoreApplicationandAPIService- 
4617993073/api/school";
    try {
      // EasyLoading.show(status: 'Loading...');
      final response = await http.get(Uri.parse(url));
      final extractedData = json.decode(response.body);
      if (extractedData == null) {
        return;
      }
      if (response.statusCode == 200) {
        print(extractedData);
      }
      HomePageModel loadedHomeData = 
HomePageModel.fromJson(extractedData);
      _hItem = loadedHomeData;
      // EasyLoading.showSuccess("data fetched sucessfull");
      notifyListeners();
    } catch (e) {
      rethrow;
    }
  }
}

【讨论】:

  • 我无法分配 _hItem = loadedHomeData;这个
  • 您是否已将 _hItem 从列表类型更改为对象?喜欢这个 HomePageModel? _h项目; HomePageModel 获取 hItem { return _hItem!; }
  • 是的,我做到了,它消除了错误,但我是在 didChangedependency 中的 getHomeData 并使用 Listview.builder 但我仍然收到错误
  • 它是说空值检查运算符用于空值,还有错误:在此 HomePageDesign 小部件上方找不到正确的 Provider
  • 复制并粘贴我提供的整个代码并将其替换为您的文件。
【解决方案2】:
 getHomeData(BuildContext context) async {
const url =
    "https://shikshyasoftware.com.np/CoreApplicationandAPIService-4617993073/api/school";
try {
  // EasyLoading.show(status: 'Loading...');
  final response = await http.get(Uri.parse(url));

  if (response.statusCode == 200) {
    final extractedData = json.decode(response.body);
    List loadedHomeData = extractedData;
    _hItem = loadedHomeData.map((e) => HomePageModel.fromJson(e)).toList();
  }
  notifyListeners();
  return _hItem;
} catch (e) {
  rethrow;
}

}

【讨论】:

  • 仍然收到错误提示 Unhandled Exception: type '_InternalLinkedHashMap' is not a subtype of type 'List'
  • 列出加载的HomeData=extractedData['data'];
  • 当我尝试使用 listview.builder 中的数据时出现此错误 用于空值的空检查运算符
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 2017-01-04
  • 2021-09-18
  • 2016-05-12
  • 1970-01-01
  • 2022-11-07
  • 2018-11-27
相关资源
最近更新 更多