【问题标题】:The getter 'length' was called on null. Receiver: null Tried calling: length FutureBuilder with List在 null 上调用了 getter 'length'。接收方:null 尝试调用:长度 FutureBuilder 和列表
【发布时间】:2021-10-20 10:16:44
【问题描述】:

我在 Flutter 应用程序运行时不断收到上述错误。基本上我想要实现的是从 api 获取数据并使用 FutureBuilder 以 SliverList 的形式显示它。

在我将列表的代码从 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),
           );
       });
  }

我不知道我到底错过了什么,因为如果我使用动态类型而不是自定义类 EntertainerEvent,则此代码有效。

提前谢谢大家!

【问题讨论】:

    标签: flutter api rest


    【解决方案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();
    
    

    【讨论】:

    • 您好,感谢您的帮助。不幸的是,这是不可行的,因为如果正文代码正常完成,可能会返回 null。请参阅下面的错误:主体可能正常完成,导致返回“null”,但返回类型可能是不可为空的类型。 (文档)尝试在末尾添加 return 或 throw 语句。
    • 这就是为什么我在if(hasData)外部添加了最后一个返回,加载微调器
    • 是的,我注意到了,但它给出了一个错误“A RenderViewport 需要一个 RenderSliv​​er 类型的子级,但收到了一个 RenderPositionedBox 类型的子级。”这是由于 loadSpinner
    猜你喜欢
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    相关资源
    最近更新 更多