在 null Flutter 上调用了 getter 'length'

Posted

技术标签:

【中文标题】在 null Flutter 上调用了 getter \'length\'【英文标题】:The getter 'length' was called on null Flutter在 null Flutter 上调用了 getter 'length' 【发布时间】:2021-08-11 11:10:09 【问题描述】:

我正在尝试从我的本地 JSON 文件中获取数据并显示它。一切都准备好了,但我得到了 The getter 'length' was called on null 错误。它在另一个模拟器中工作,但是当我改变它时它停止工作。当我删除长度方法时,getter [] 在 null 上被调用。

我在网上查了一下,但找不到适合我的东西。谁能告诉我我做错了什么? 这是我的代码:

import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:medicine_reminder/src/ui/homepage/homepage.dart';

class JsonPage extends StatefulWidget 
  @override
  _JsonPageState createState() => _JsonPageState();


class _JsonPageState extends State<JsonPage> 
  List data;

  @override
  Widget build(BuildContext context) 
    return Scaffold(
        appBar: AppBar(
          toolbarHeight: 90,
          backgroundColor: Color(0xFF3EB16F),
          title: Text("Medicine List"),
          centerTitle: true,
          textTheme: TextTheme(
            headline6: TextStyle(fontSize: 44, fontFamily: "Angel"),
          ),
        ),
        body: new Container(
          child: new Center(
              child: new FutureBuilder(
            future: DefaultAssetBundle.of(context)
                .loadString('assets/csvjson_2son.json'),
            builder: (context, snapshot) 
              var mydata = JsonDecoder().convert(snapshot.data.toString());

              data.length;
              return new ListView.builder(
                  itemBuilder: (BuildContext context, int index) 
                _listItem(index);
                return new Card(
                    child: new Column(
                  crossAxisAlignment: CrossAxisAlignment.stretch,
                  children: <Widget>[
                    new Text(
                      "" + mydata[index]['ILAC ADI'],
                      style: TextStyle(
                          fontWeight: FontWeight.bold,
                          color: Colors.deepOrange),
                    ),
                    new Text("Etken Madde: " + mydata[index]['ETKIN MADDE']),
                    new Text("ATC Adı: " + mydata[index]['ATC ADI']),
                    new Text("ATC Kodu: " + mydata[index]['ATC KODU']),
                    new Text("Barkod: " + mydata[index]['BARKOD'].toString()),
                    new Text("Firma Adı: " + mydata[index]['FIRMA ADI']),
                    new Text("Referans Eşdeğeri: " +
                        mydata[index]['REFERANS \nESDEGER']),
                    new Text(
                        "Eşdeğeri: " + mydata[index]['ESDEGERI'].toString()),
                    new Text("Ambalaj Miktarı: " +
                        mydata[index]['AMBALAJ MIKTARI'].toString()),
                    new Text("Reçete: " + mydata[index]['RECETE']),
                    new Text("Satış Fiyatı: " +
                        mydata[index]['KDV DAHIL PERAKENDE SATIS TL FIYATI']
                            .toString()),
                  ],
                ));
              );
            ,
          )),
        ),
        floatingActionButton: Stack(
          children: <Widget>[
            Padding(
              padding: EdgeInsets.only(left: 15),
              child: Align(
                heightFactor: 13.6,
                alignment: Alignment.topLeft,
                child: FloatingActionButton(
                  backgroundColor: Colors.transparent,
                  onPressed: () 
                    Navigator.push(
                        context,
                        MaterialPageRoute(
                          builder: (context) => HomePage(),
                        ));
                  ,
                  child: Icon(Icons.arrow_back),
                ),
              ),
            ),
          ],
        ));
  

  _listItem(index) 
    return Card(
      child: Padding(
        padding: const EdgeInsets.only(
            top: 32.0, bottom: 32.0, left: 16.0, right: 16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            Text(
              data[index].title,
              style: TextStyle(fontSize: 22, fontWeight: FontWeight.bold),
            ),
            Text(
              data[index].text,
              style: TextStyle(color: Colors.grey.shade600),
            )
          ],
        ),
      ),
    );
  


【问题讨论】:

使用FutureBuilder 时,您应该检查snapshot 是否有数据或仍在加载。检查这个:***.com/a/59073613/6819340 【参考方案1】:

您在 _JsonPageState 类中定义了一个 List data;,但您没有在任何地方为其分配值。

但是在build 方法中,您尝试访问data.length;,这将引发上述错误,因为data 仍然为空。

看你没用那行,把data.length去掉就行了。这将解决您发布的问题。

其次,正如@DarShan 所说,一旦您当前的问题得到解决,您将面临另一个问题。

也就是说,FutureBuilder 需要时间来从您的 future 加载数据。所以你不能直接访问snapshot.data.toString(),因为snapshot.data 可能为空。

所以,在您的 builder 中添加这样的额外检查,

builder: (context, snapshot) 
  if (snapshot.data == null) return Text('Loading'); // Add this

  var mydata = JsonDecoder().convert(snapshot.data.toString());

  return new ListView.builder(

您不仅可以返回Text('Loading'),还可以显示任何类型的Loader

【讨论】:

但是当我删除 data.length 时,错误变为“在 null 上调用了方法 '[]'”。这是为什么呢? 您还在代码中调用_listItem(index),在_lisItem 函数中再次调用data。所以从你的itemBuilder 中删除_listItem(index)

以上是关于在 null Flutter 上调用了 getter 'length'的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:在 null 上调用了“add”方法

Flutter:抛出了 NoSuchMethodError。在 null 上调用了 getter 'type'

Flutter / Firebase在null上调用了getter'length'

Flutter:在 null 上调用了“add”方法

Flutter 错误在 null 上调用了方法“[]”。接收方:null 尝试调用:[]("videoId")

Hive/Flutter 错误:在 null 上调用了“registerAdapter”