簡體   English   中英

我正在嘗試從 API 獲取數據但出現錯誤

[英]I am trying to get data from API but having error

這是我的 model class,我正在嘗試獲取所有數據,但出現錯誤,不知道為什么。

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'

問題是您嘗試解析數據的方式,您不需要遍歷每個元素來解析它,在您的 model 中,只需讓它返回這樣的列表類型,

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;
  }
}

在您看來 model 您可以像這樣解析從 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;
    }
  }
}
 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;
}

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM