【问题标题】:Flutter - Nosuchmethoderror the getter 'length' was called on nullFlutter - Nosuchmethoderror getter'length'被调用为null
【发布时间】:2020-07-29 18:56:00
【问题描述】:

刷新页面时,首先出现此错误,然后才起作用。

错误:在 null 上调用了 getter 'isNotEmpty'。 接收方:空 尝试调用:isNotEmpty

class TreePage extends StatefulWidget {
  String vp;
  TreePage({this.vp});
  @override
  _TreePageState createState() => _TreePageState();
}


class _TreePageState extends State<TreePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.blue,
        title: Text('Проверка штрафов',
        style: TextStyle(color: Colors.white,),
        ),
        centerTitle: true,
      ),
      //new return Container(),

      body: new FutureBuilder(
        future: getPhoneFinal(widget.vp),

        //future: codePhone(widget.code),
        builder: (context, snapshot){
          List data = snapshot.data;
          Map shtr = getByKeySh(); 
          Map shtrIm = getByKeyIm();
          Map violQnt;
          if(data.isNotEmpty){
            violQnt = getViolationQnt(data);
          }else{
            violQnt = null;
          }
          if(snapshot.hasError){
            print (snapshot.error);
            return Text('Не удалось получить ответ от сервера',
            style: TextStyle(color: Colors.red,
            fontSize: 22.0)
            );
          }
          else if(snapshot.hasData ){     
              return ListView.builder (
              itemCount: snapshot.data.length, //length of snapshot data
              itemBuilder: (BuildContext ctxt, int index) {              
              return Container(              
                  child:Column(
                    children: <Widget>[  
                      (index == 0)?
                        new Container(
                          child:Column(
                        children: <Widget>[ 
                          new Text('Подтвержденные штрафы:  ${violQnt['approved_qnt']}'), 
                        ]
                        ),


                        )
                      : new Container(),


                       new Container(                                                
                          child: Image.asset(
                            'images/${shtrIm[data[index] ['VId']]}',
                            width: 50,
                            height: 50,
                          ),
                      ),

                      new Container(                                                
                          child: Image.asset(                            
                            'images/${(data[index] ['ProcessStatus']==1)? 'sts-ok.png': 'sts-no.png'}',
                            width: 50,
                            height: 50,
                          ),

                      ),
                       new Container(                                                
                          child: new Text(  

                            '${(data[index] ['IsPaid']==1)? 'Да': 'нет'}',

                          ),

                      ),

                      new Container(                                                
                          child: new Text(                           
                          //'Тип штрафа:  ${data[index]['VDescription']}'
                          'Тип штрафа: ${shtr[data[index] ['VId']]}'


                            ),
                      ),
                      new Container(                                                
                          child: new Text(                           
                          'Адрес:  ${data[index]['VLocation']}'                         
                            ),
                      ),
                      new Container(                                                
                          child: new Text(                           
                          'Дата:  ${data[index]['VTime']}'                         
                            ),
                      ),
                    ],
                  ),
              );
            }
        );       
          }else if(!snapshot.hasData){
            return new Center(child: CircularProgressIndicator(),);
          }
        }),
    );
  }

 // getFine(String vp) {}


}



Future<Map> getPhone(String phone,String code) async{
  String url = 'xxx/xxx/$phone/$code';
  http.Response response = await http.get(url);
  //var sts = response.statusCode;
  //log( response.statusCode);
  //  var ar = {
  //    'sts': response.statusCode,
     //'data': json.decode(response.body)
   //};
  return json.decode(response.body);
}

Future<List> getPhoneFinal(String numbCar) async{
  String url = 'xxx/xxx/$numbCar';
  http.Response response = await http.get(url);
  return json.decode(utf8.decode(response.bodyBytes));
}



Map<String, String> getByKeySh() {
  return {
            '1625': 'Проезд на красный сигнал светофора',
            '1302': 'Проезд на красный сигнал светофора',
            '1230': 'Пересечение сплошной линии',
            '1301': 'Движение по встречной полосе',
            //1301 => 'Выезд на полосу встречного движения',
            '1345': 'Выезд за стоп-линию'
  };
}
  Map<String, String> getByKeyIm() {
  return {
            '1625': '1625.png',
            '1302': '1302.png',
            '1230': '1230.png',
            '1301': '1301.png',
            //1301 => '',
            '1345': '1345.png'
  };


}

Map<String, int> getViolationQnt(List data ) {
        var total_qnt = 0;
        var approved_qnt = 0;
        var paid_qnt = 0;
        var process_qnt = 0;

 // if(data.isNotEmpty){

    for(var i=0; i< data.length; i++){
      total_qnt++;
      if(data[i]['IsPaid'] == 1){
        paid_qnt++;
      }
      if(data[i]['IsPaid'] == 0 && data[i]['ProcessStatus'] == 1){
        approved_qnt++;
      }
      if(data[i]['IsPaid'] == 0 && data[i]['ProcessStatus'] != 1){
        process_qnt++;
      }
    }
 // }
  return {
            'total_qnt': total_qnt,
            'approved_qnt': approved_qnt,
            'paid_qnt': paid_qnt,
            'process_qnt': process_qnt,
  };


}

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    请用data.length &gt; 0代替data.isNotEmpty()也可以用snapshot.hasData检查

    【讨论】:

    • 不错的建议,但这不是答案。您可能希望将此(等)作为对原始问题的评论发布。
    • 这有帮助!谢谢)
    • 如何放置以便在 10 个元素之后出现“更多”按钮?事实证明,每个元素都会出现“更多”按钮。给点建议,谢谢。
    【解决方案2】:

    我在使用 FutureBuilder 时遇到了同样的问题。在检索结果之前我有一些延迟。在您的情况下,列表数据为空,因为尚未收到响应,这证明您的错误是合理的,并且当收到数据时,它可以工作。你可能想添加一个加载器,等待响应到来,然后再继续

    【讨论】:

      【解决方案3】:

      当您的FutureBuilder 在您第一次没有数据时调用它的构建器方法时。所以你应该先检查一下。

      FutureBuilder(
              future: getPhoneFinal(widget.vp),
              builder: (context, snapshot){
                if(snapshot.hasData){
                  List data = snapshot.data;
                  ...
                }else{
                  return Container(); //or show a loading spinner
                }
      
      

      【讨论】:

        猜你喜欢
        • 2020-09-22
        • 2020-04-09
        • 1970-01-01
        • 2020-06-07
        • 2022-11-07
        • 2020-07-13
        • 2021-10-25
        • 2020-10-12
        • 2020-12-26
        相关资源
        最近更新 更多