«Длина» геттера была вызвана при нуле. Получатель: null Попытался позвонить: длина FutureBuilder со списком

#flutter #api #rest

Вопрос:

Я продолжаю получать ошибку, упомянутую выше, во время выполнения моего приложения flutter. В основном я пытаюсь получить данные из api и отобразить их в виде списка сливерлиста с помощью FutureBuilder.

Это работало отлично, пока я не изменил свой код для списка с FutureBuilder<Список> на FutureBuilder<Список><Список>, чтобы использовать класс EntertainerEvent, в котором есть все поля, необходимые для отображения из файла json. Как я могу решить эту проблему, потому что кажется, что конструктор или его приложение не собирают данные, когда я использую пользовательский класс.

Это код для класса EntertainerEvent:

     class EntertainerEvent {
      final int eventId;
      final int entertainerId;
      final int eventTypeId;
      final int categoryId;
      final String eventName;
      final String description;
      final String imagePoster;
      final String location;
      final DateTime startDate;
      final DateTime endDate;
      final double entreeFee;
    
      const EntertainerEvent({required this.eventId, required this.entertainerId, required this.eventTypeId,
        required this.categoryId, required this.eventName, required this.description, required this.imagePoster,
        required this.location, required this.startDate, required this.endDate, required this.entreeFee});
    
      factory EntertainerEvent.fromJson(Map<String, dynamic> event) {
        return EntertainerEvent(
          eventId: event['EventID'],
          entertainerId: event['EntertainerID'],
          eventTypeId: event['EventTypeID'],
          categoryId: event['CategoryID'],
          eventName: event['EventName'],
          description: event['Description'],
          imagePoster: event['ImagePoster'],
          location: event['Location'],
          startDate: event['StartDate'],
          endDate: event['EndDate'],
          entreeFee: event['EntryFee'],
        );
      }
    }
 

Ниже приведен код для извлечения данных из api:

 
Future<List<EntertainerEvent>> fetchEvents() async {
    var result = await http.get(Uri.parse(apiUrl));

    if (result.statusCode == 200) {
      var content = result.body;
      var arr = json.decode(content) as List;

      return arr.map((eve) => new EntertainerEvent.fromJson(eve)).toList();
    } else {
      print('Not loaded');
      throw Exception('Unable to fetch data from the Rest API');
    }
  }

  late Future<List<EntertainerEvent>> _fetchEvents;

  @override
  void initState() {
    _fetchEvents = fetchEvents();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return FutureBuilder<List<EntertainerEvent>>(
        future: _fetchEvents,
        builder: (BuildContext context, AsyncSnapshot snapshot) {
          var childCount = 0;
          if (snapshot.connectionState != ConnectionState.done) {
            childCount = 1;
          } else {
            childCount = snapshot.data.length;
          }
          return SliverList(
            delegate: SliverChildBuilderDelegate((context, index) {
              if (snapshot.hasData) {
                List<EntertainerEvent> someData = snapshot.data;
                print('data here');
               
                //Do some stuff

               }
              },  childCount: childCount),
           );
       });
  }
 

Я не знаю, чего именно мне не хватает, потому что этот код работает, если я использую тип dynamic вместо пользовательского класса EntertainerEvent.

Заранее всем вам спасибо!

Ответ №1:

Заверните его в hasData :

 if(snapshot.hasData){
return SliverList(
            delegate: SliverChildBuilderDelegate((context, index) {
          
                List<EntertainerEvent> someData = snapshot.data;
                print('data here');
               
                //Do some stuff

             
              },  childCount: childCount),
           );}
    return CircularProgressIndicator();

 

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

1. Привет, спасибо вам за вашу помощь. К сожалению, это нецелесообразно, так как null может быть возвращен, если основной код завершается нормально. См.Ошибку ниже: Тело может завершиться нормально, в результате чего будет возвращено значение «null», но возвращаемый тип является потенциально ненулевым типом. (Документация) Попробуйте добавить в конце оператор return или throw.

2. Вот почему я добавил последний возврат, загрузочный счетчик, снаружи if(hasData)

3. Да, я заметил это, но это выдает ошибку «Порт просмотра ожидал появления дочернего элемента типа renderssliver, но получил дочерний элемент типа RenderPositionedBox». Это связано с загрузкой