如何使用提供程序在Flutter UI中使用API​​响应获取ListView构建器数据

问题描述

我正在尝试从提供程序获取响应并在ui页面中获取,但是当我尝试向ui添加响应时,它显示错误 The getter 'data' was called on null. Receiver: null Tried calling: data

在此行:

ListView.builder(
                              physics: ClampingScrollPhysics(),shrinkWrap: true,itemCount: doctorList.data.length,primary: true,

这是正确的方法还是需要更改模式类或ui集成。 即时消息通过doctorList.data .->数据数据访问数据。

我的响应模式类。

import 'dart:convert';

Doctorlist doctorlistFromJson(String str) => Doctorlist.fromJson(json.decode(str));

String doctorlistToJson(Doctorlist data) => json.encode(data.toJson());

class Doctorlist {
    Doctorlist({
        this.status,this.message,this.data,});

    int status;
    String message;
    List<Datum> data;

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

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

class Datum {
    Datum({
        this.id,this.mobile,this.userImage,this.emrNumber,this.hospital,this.status,this.doctorName,this.docRole,this.email,this.gender,this.address,this.city,this.state,this.pincode,this.clinicName,this.appointmentDate,this.favourite,});

    String id;
    String mobile;
    String userImage;
    String emrNumber;
    String hospital;
    String status;
    String doctorName;
    String docRole;
    String email;
    String gender;
    String address;
    String city;
    String state;
    String pincode;
    String clinicName;
    DateTime appointmentDate;
    String favourite;

    factory Datum.fromJson(Map<String,dynamic> json) => Datum(
        id: json["id"],mobile: json["mobile"],userImage: json["user_image"],no: json["no"],hospital: json["hospital"],status: json["status"],doctorName: json["doctor_name"],docRole: json["doc_role"],email: json["email"],gender: json["gender"],address: json["address"],city: json["city"],state: json["state"],pincode: json["pincode"],clinicName: json["clinic_name"],appointmentDate: DateTime.parse(json["appointment_date"]),favourite: json["favourite"],dynamic> toJson() => {
        "id": id,"mobile": mobile,"user_image": userImage,"emr_number": emrNumber,"hospital": hospital,"status": status,"doctor_name": doctorName,"doc_role": docRole,"email": email,"gender": gender,"address": address,"city": city,"state": state,"pincode": pincode,"clinic_name": clinicName,"appointment_date": "${appointmentDate.year.toString().padLeft(4,'0')}-${appointmentDate.month.toString().padLeft(2,'0')}-${appointmentDate.day.toString().padLeft(2,'0')}","favourite": favourite,};
}

我的提供者类:

class DoctorListProvider extends ChangeNotifier {
  Doctorlist doctorList;

  Future<Doctorlist> doctorlist() async {
    
    try {
      final response = await http.post(
          (Commons.baseURL + "/list"),headers: {
            "Accept": "application/json","content-type": "application/json",},body:{"id":5});
      if (response.statusCode == 200) {
        var responseJson = Commons.returnResponse(response);
        doctorList = Doctorlist.fromJson(responseJson);
        print(doctorList);
        return Doctorlist.fromJson(responseJson);
      } else {
        return null;
      }
    } on SocketException {
      return null;
    }
  }
}

“我的ui列表视图”构建器页面:

class _DoctorState extends State<Doctor> {
  Doctorlist doctorList;
  bool fav = true;
  @override
  void initState() {
     doctorList =
        Provider.of<DoctorListProvider>(context,listen: false).doctorList;
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
ListView.builder(
                          physics: ClampingScrollPhysics(),// itemCount: 2,// reverse: false,itemBuilder: (BuildContext context,int index) {
                            return Column(
                              mainAxisSize: MainAxisSize.min,children: <Widget>[
                                Container(
                                    child: Flexible(
                                        child:
                                        Container(child:
                   InkWell(
                      onTap: (){
                      Navigator.push(context,MaterialPageRoute(builder: (context) => Doctordetails()));
                                          },child: 
                                         Card(
                                           
                                            // color: Color(0xff29ABE2),child: ConstrainedBox(
                                                constraints: BoxConstraints(
                                                  minHeight: 100,),child: Padding(
                                                    padding: EdgeInsets.only(
                                                        left: 10,right: 0,top: 10),child: Row(
                                                      children: <Widget>[
                                                        Column(
                                                          crossAxisAlignment:
                                                              CrossAxisAlignment
                                                                  .start,children: <Widget>[
                                                            Row(
                                                              mainAxisAlignment:
                                                                  MainAxisAlignment
                                                                      .start,crossAxisAlignment:
                                                                  CrossAxisAlignment
                                                                      .start,children: <
                                                                  Widget>[
                                                                Container(
                                                                  decoration:
                                                                      new BoxDecoration(
                                                                    borderRadius:
                                                                        BorderRadius.all(
                                                                            const Radius.circular(100.0)),border: Border.all(
                                                                        color: Colors
                                                                            .black),height: 70,width: 70,child:
                                                                      ClipRRect(
                                                                    borderRadius:
                                                                        BorderRadius.circular(
                                                                            200),child: Image
                                                                        .asset(
                                                                      'assets/images/registration/profile_side.png',fit: BoxFit
                                                                          .fill,SizedBox(
                                                                  width: MediaQuery.of(
                                                                              context)
                                                                          .size
                                                                          .height /
                                                                      80,Column(
                                                                  crossAxisAlignment:
                                                                      CrossAxisAlignment
                                                                          .start,children: <
                                                                      Widget>[
                                                                             
                                                                    Text(
                                                                      "no",style: TextStyle(
                                                                          fontFamily:
                                                                              "SansBold",fontSize:
                                                                              15,color:
                                                                              Colors.black),Text(
                                                                      "no",style: TextStyle(
                                                                          fontFamily:
                                                                              "SansRegular",SizedBox(
                                                                      height: 5,SizedBox(
                                                                      height: MediaQuery.of(context)
                                                                              .size
                                                                              .height /
                                                                          13,width: MediaQuery.of(context)
                                                                              .size
                                                                              .width /
                                                                          1.9,child:
                                                                          AutoSizeText(
                                                                        'no ',style: TextStyle(
                                                                            fontSize:
                                                                                20),maxLines:
                                                                            3,)
                                                                  ],Container(
                                                                    child:
                                                                        IconButton(
                                                                  onPressed:
                                                                      () {
                                                                    setState(
                                                                        () {
                                                                      fav =
                                                                          !fav;
                                                                    });
                                                                  },icon: fav
                                                                      ? Image.asset(
                                                                          "assets/images/appointment/favourite_unselected.png")
                                                                      : Image.asset(
                                                                          "assets/images/appointment/favourite_select.png"),))
                                                              ],SizedBox(
                                                              height: 5,Row(
                                                              children: <
                                                                  Widget>[
                                                                Container(
                                                                  child: IconButton(
                                                                      icon: Image
                                                                          .asset(
                                                                              "assets/images/appointment/last_appointment.png"),onPressed:
                                                                          null),SizedBox(
                                                                  width: 10,Text(
                                                                  "Last appointment date",style: TextStyle(
                                                                      fontFamily:
                                                                          "SansRegular",fontSize:
                                                                          15,color: Colors
                                                                          .black),)
                                                              ],Container(
                                                              child: Text(
                                                                  "06-08-2020"),],SizedBox(
                                                          width: MediaQuery.of(
                                                                      context)
                                                                  .size
                                                                  .width /
                                                              40,))))))))
                              ],);
                          },

我的Json响应看起来像这样。

{
    "status": 1,"message": "success","data": [
        {
            "id": "1","mobile": "7","user_image": "https://hghjfjd.com","emr_number": "er-357","hospital": "ff","status": "1","doctor_name": "sanje","doc_role": "dfd","email": "doctor@gmail.com","gender": "Male","address": "test mode","city": "england","state": "tn","pincode": "633211","clinic_name": "clinic","appointment_date": "2020-09-07","favourite": "No"
        },

解决方法

尝试一下:

):将initState()方法编辑为:

 @override
    void initState(){
        WidgetsBinding.instance.addPostFrameCallback((_) => _afterLayout(context));
    }

):现在,您可以使用_afterLayout(context)方法加载项目:

_afterLayout(BuildContext context) async {
    var docState = Provider.of<DoctorListProvider>(context);
    docState.setDoctorList(await docState.doctorlist());
}

):更新此类DoctorListProvider

class DoctorListProvider extends ChangeNotifier {
  Doctorlist _doctorList;

  Doctorlist get getDoctorList => _doctorList;

 set setDoctorList(Doctorlist input){
    _doctorList = input;
    notifierListners();
 }

  ...
}

):最后在您的UI中使用它:

class _DoctorState extends State<Doctor> {
      bool fav = true;
      @override
        void initState(){
            WidgetsBinding.instance.addPostFrameCallback((_) => _afterLayout(context));
        }
    
      @override
      Widget build(BuildContext context) {
        var docState = Provider.of<DoctorListProvider>(context);

          return docState.getDoctorList == null ? Container(child: CircularProgressIndicator()) : 
          ListView.builder(
               physics: ClampingScrollPhysics(),shrinkWrap: true,itemCount: docState.getDoctorList.data.length,// itemCount: 2,// reverse: false,primary: true,itemBuilder: (BuildContext context,int index) {

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...