在 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:抛出了 NoSuchMethodError。在 null 上调用了 getter 'type'
Flutter / Firebase在null上调用了getter'length'