Пустой экран при извлечении данных из api

#node.js #flutter #api #android-listview #flutter-futurebuilder

Вопрос:

Я извлекаю данные api и отображаю их в списке с помощью ListView builder , он правильно работает на эмуляторе, но когда я запускаю приложение на своем телефоне Android, он отображает пустой экран, вот он выглядит.

введите описание изображения здесь

под меткой «Оставить историю» я отображаю данные из api, но сейчас это выглядит так.

Это выглядит так на эмуляторе

введите описание изображения здесь

Вот код:

Извлечение данных api и вставка их в список

 List<leaveHistory> historyList = [];
var loader = 0;
Future<List<leaveHistory>> _getRecord() async {
    Dio dio = new Dio();
    var data = {
      'username': getname,
      'token': getaccesstoken,
    };

    return dio
        .post(localhostUrlLeaveHistoryON, data: json.encode(data))
        .then((onResponse) async {
      Map<String, dynamic> map = onResponse.data;
      List<dynamic> data = map["data"];

      for (var historyData in data) {
        leaveHistory history = leaveHistory(
            historyData["Date"],
            historyData["description"],
            historyData["type"],
            historyData['fromdate'],
            historyData["todate"],
            historyData["noofleavedays"],
            historyData["leave"]);
        historyList.add(history);
        loader = 0;
      }
      if (historyList.length == 0) {
        loader = 1;
      }
      return historyList;
    }).catchError((onerror) {
      loader = 1;
print(onerror.toString());
    });
  }
 

display the data using ListView.builder

 Widget build(BuildContext context) {
    return Scaffold(
        appBar: new MyAppBar(
            title: Text("Leaves Tracker"),
            onpressed: () {
              Navigator.push(
                  context, MaterialPageRoute(builder: (context) => Profile()));
            }),
        drawer: NavigationDrawerWidget(),
        body: Stack(overflow: Overflow.visible, children: <Widget>[
          Container(
            padding: EdgeInsets.fromLTRB(20, 10, 0, 0),
            child: Text(
              "Leave History",
              style: TextStyle(fontSize: 30, fontFamily: 'RaleWay'),
            ),
          ),
          Container(
            padding: EdgeInsets.fromLTRB(10, 30, 0, 0),
            child: FutureBuilder(
                future: _getRecord(),
                builder: (BuildContext context,
                    AsyncSnapshot<List<leaveHistory>> snapshot) {
                  if (snapshot.hasData) {
                    if (historyList.length != 0) {
                      return Container(
                          padding: EdgeInsets.fromLTRB(0, 30, 0, 0),
                          child: Expanded(
                              child: ListView.builder(
                            itemCount: snapshot.data.length,
                            scrollDirection: Axis.vertical,
                            shrinkWrap: true,
                            itemBuilder: (BuildContext context, int index) {
                              Color c = Colors.red;
                              //changing the avatar color
                              if (i == 0)
                                i  ;
                              else if (i == 1) {
                                c = Colors.blue;
                                i  ;
                              } else if (i == 2) {
                                c = Color(int.parse(annualboxcolor));
                                i = 0;
                              }

                              Color c1 = Colors.green;
                              if (snapshot.data[index].Status == "Approved") {
                                c1 = Colors.green;
                              } else if (snapshot.data[index].Status ==
                                  "Not Approved") {
                                c1 = Colors.red;
                              } else if (snapshot.data[index].Status ==
                                  "Pending") {
                                c1 = Color(int.parse(pendingrequestcolor));
                              }
                              return SingleChildScrollView(
                                  scrollDirection: Axis.vertical,
                                  child: Column(
                                    children: [
                                      ListTile(
                                          leading: CircleAvatar(
                                              radius: 25,
                                              backgroundColor: c,
                                              child: Container(
                                                padding: EdgeInsets.fromLTRB(
                                                    0, 10, 0, 0),
                                                child:
                                                    Column(children: <Widget>[
                                                  Text(
                                                    snapshot
                                                        .data[index].noofdays
                                                        .toString(),
                                                    style: TextStyle(
                                                        fontSize: 15.0,
                                                        fontWeight:
                                                            FontWeight.bold,
                                                        color: Colors.white),
                                                  ),
                                                  Text(
                                                    int.parse(snapshot
                                                                .data[index]
                                                                .noofdays) >
                                                            1
                                                        ? "Days"
                                                        : "Day",
                                                    style: TextStyle(
                                                        fontSize: 10.0,
                                                        color: Colors.white),
                                                  )
                                                ]),
                                              )),
                                          title:
                                              Text(snapshot.data[index].type),
                                          isThreeLine: true,
                                          subtitle: Column(
                                            crossAxisAlignment:
                                                CrossAxisAlignment.start,
                                            children: [
                                              Text(
                                                snapshot.data[index].fromdate  
                                                    " To "  
                                                    snapshot.data[index].todate,
                                              ),
                                              Text(snapshot.data[index].Status,
                                                  style: TextStyle(
                                                      color: c1,
                                                      fontWeight:
                                                          FontWeight.bold)),
                                              Text(
                                                snapshot
                                                    .data[index].description,
                                              )
                                            ],
                                          )),
                                      Divider(
                                        color: Colors.grey,
                                        height: 10,
                                      ),
                                    ],
                                  ));
                            },
                          )));
                    }
                  }

                  if (loader == 1) {
                    print("run");
                    return Nodatafound();
                  } else {
                    return Center(
                        child: CircularProgressIndicator(
                      color: Colors.blue[500],
                    ));
                  }
                }),
          ),
        ]));
  }
}
 

урок истории

 class leaveHistory {
  final String date;
  final String fromdate;
  final String todate;
  final String description;
  final String type;
  final String Status;
  final String noofdays;

  leaveHistory(this.date, this.description, this.type, this.fromdate,
      this.todate, this.noofdays, this.Status);
}
 

Когда я перенаправляю на этот экран из ящика, он сначала отображает эту ошибку

 DioError [DioErrorType.response]: Http status error [300]
 

на этой catchError этой линии print(onerror.toString());

Обновить:

Когда я подключаю свой телефон к ноутбуку с помощью datacable, он работает нормально, но при установке apk возникает проблема.

Пожалуйста, помогите, где я поступаю неправильно.

Комментарии:

1. вы установили разрешение на доступ в Интернет в файле Android?

2. @RavindraS.Patil да

Ответ №1:

Если @Huthaifa не был тем ответом, который вы ищете, вы пытались обновить значение: localhostUrlLeaveHistoryON ?

Если вы используете что-то вроде: http://localhost

Пожалуйста, попробуйте изменить это на IP-адрес вашего компьютера.

Комментарии:

1. Я сомневаюсь, что это проблема с Интернетом или связана с API. Это также отображается в сборках выпуска, потому что именно так ошибки отображаются в выпуске в виде серых областей вместо обычного красного экрана.

2. да, вот почему я сначала сделал оговорку. Но, скорее всего, это из-за обнаруженной ошибки в dio.

3. На самом деле может быть и то, и другое.

4. епип, давай подождем его драгоценного ответа, ха-ха.

5. ха-ха, оба ответа мне не помогают! я получаю данные ответа api на своем экране, я тоже получаю ошибку 300, я думаю, что сначала, когда я перенаправляю на экран, он отправляет мне ошибку 300 и тоже справляюсь с этим, я отображаю циклический загрузчик, который отображается, когда я перенаправляю этот экран, а затем через несколько секунд он отображает мои данные

Ответ №2:

Ваша ошибка вызвана неправильным использованием виджета родительских данных. И это из-за использования расширенного внутреннего контейнера. Уберите свои Expanded отсюда:

 return Container(
                          padding: EdgeInsets.fromLTRB(0, 30, 0, 0),
                          child: Expanded(
                              child: ListView.builder(
 

Вы также заметите, что ошибка в консоли исчезла. Всегда читайте ошибки и разбирайтесь в них. Ошибка будет на 100% означать, incorrect use of parent widget . Просто удалите расширенное.

Комментарии:

1. я все еще incorrect use of parent widget получаю ошибку и ошибку dio 300 на эмуляторе тоже,

2. Пожалуйста, проверьте мою часть обновления после публикации