ListView не показывает результат, если список пуст

#flutter

#flutter

Вопрос:

Я загружаю данные из удаленного api:

Это файл dart, который обеспечивает подключение и загрузку:

clinica-api.dart

 import 'package:flutter_capenergy/modelos/clinica.dart';
import 'package:http/http.dart' as http;


Future<List<Clinica>> fetchClinicas(String idUsuario) async {

  
  String url ="https://..flutter_api/get_clinicas.php";
  final response = await http.get(url);
  
  if (response.body == "[]"){
    

  }
  return clinicaFromJson(response.body);

}
  

И это фрагмент кода из misclinicas.dart, где я показываю список:

  Expanded(
              child: Container(
                child: FutureBuilder(
                  future: fetchClinicas(miId),
                  builder: (context, snapshot) {
                    if (snapshot.hasData) {
                      return ListView.builder(
                        itemCount: snapshot.data.length,
                        shrinkWrap: true,
                        itemBuilder: (BuildContext context, index) {
                          print(index.toString());
                          Clinica clinica = snapshot.data[index];
                          return new GestureDetector(
                            onTap: () {
                              clinicaProvider.setClinica(clinica.nombreClinica);
                              clinicaProvider.setClinicaId(clinica.idClinica);
                            } ,
                            child: new Card(
                              elevation: 6,
                              child: new Column(
                                children: [
                                  new Padding(
                                    padding: const EdgeInsets.all(8.0),
                                    child: Column(
                                      crossAxisAlignment: CrossAxisAlignment
                                          .start,
                                      children: [
                                        Row(
                                          crossAxisAlignment: CrossAxisAlignment
                                              .center,
                                          mainAxisAlignment: MainAxisAlignment
                                              .center,
                                          children: <Widget>[
                                            Image.network(
                                              'https://.../${clinica
                                                  .logoClinica}',
                                              height: 180,
                                              alignment: Alignment.center,),

                                          ],

                                        ),
                                        Text(
                                          '${clinica.nombreClinica}',
                                          style: TextStyle(fontSize: 16,
                                              fontWeight: FontWeight.bold,
                                              color: Colors.blue),

                                        ),
                                        Text(
                                          '${clinica.direccionClinica}',
                                          style: TextStyle(fontSize: 14,
                                              color: Colors.grey,
                                              fontStyle: FontStyle.italic),
                                        ),
                                      ],
                                    ),
                                  ),
                                ],
                              ),
                            ),
                          );
                        },
                      );
                    }
                    else {
                       Text ("NO HAY CLINICAS");
                    }

                    return Text("Cargando clínicas");
                  },
                ),
              ),
            ),
  

Если в списке есть элементы, они отображаются, но если список пуст, я хотел бы показать текст с сообщением о том, что список пуст.

Я пытаюсь сделать это, поместив этот текстовый виджет, если snapshot.hasdata значение false:

 Text ("NO HAY CLINICAS");
  

но он не отображается, я получаю только пустой ListView.

Ответ №1:

В случае с пустым списком snapshot.hasData будет true и snapshot.data.length будет равно 0.

snapshot.hasData == false означает, что он либо загружается, либо произошла ошибка.

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

1. Спасибо за ответ, но тогда как мне проверить, пуст ли список, и показать текст для пустого списка? Я пытался написать snapshot.data.length, и это недопустимо.

2. В текущем коде текст для пустого списка отображается только во время загрузки, но после завершения загрузки текст удаляется. Наверное, я поместил текст не в то место

3. Если snapshot.data.length == 0 вы вернете текст вместо ListView.

4. сначала убедитесь, что snapshot.hasData имеет значение true. итак, вы могли бы сделать snapshot.hasData == true amp;amp; snapshot.data.length == 0

Ответ №2:

в вызове api возвращает пустой список, если ответ.body =»[]»

   if (response.body == "[]"){
    List<Clinica> emptyClinica = [];
    return emptyClinica;
  }
  

в misclinicas.dart

 snapshot.data.lenth > 0 ? your list work  : Text('No Data Found')