没有为“对象”类型定义运算符“[]”。尝试定义运算符'[]'。在使用 listview builder 显示数据时
Posted
技术标签:
【中文标题】没有为“对象”类型定义运算符“[]”。尝试定义运算符\'[]\'。在使用 listview builder 显示数据时【英文标题】:The operator '[]' isn't defined for the type 'Object'. Try defining the operator '[]'. while using listview builder to show data没有为“对象”类型定义运算符“[]”。尝试定义运算符'[]'。在使用 listview builder 显示数据时 【发布时间】:2021-10-16 00:15:35 【问题描述】:我正在尝试访问和使用 listview.builder 中的 json 数据,但它显示错误,例如尝试定义运算符“[]”。这是我定义json数据的类
late Directory _appDocsDir;
late File imageFile;
class SpeakersApiData
static const String url =
'http://soundcrush.pk/wp-content/themes/speakers.json';
Future getSpeakerData() async
try
String fileName = "SpeakersData.json";
String imagebytesFilename = "Speakersimagebytes.json";
var dir = await getTemporaryDirectory();
/// for ios directory name has to change
/// for image storage
File files = File(dir.path + "/" + fileName);
File imagesbytesfile = File(dir.path + "/" + imagebytesFilename);
if (files.existsSync())
print("cached from device");
//final data = file.readAsBytesSync();
final apiData = json.decode(files.readAsStringSync());
for (int i = 0; i < apiData[0]["data"].length; i++)
//final image = Image.network(apiData[0]["data"][i]["image"]);
final imageBytes = await imagesbytesfile
.writeAsBytes(apiData[0]["data"][i]["image"].bodyBytes);
final imageBytess = await imageBytes.readAsBytesSync();
final encodedImage = convert.base64Encode(imageBytess);
myspeakerImageBase64List.add(encodedImage);
return apiData;
else
print("fetched from internet");
final response = await get(Uri.parse(url));
if (200 == response.statusCode)
//save to file
files.writeAsStringSync(response.body,
flush: true, mode: FileMode.write);
final apiBody = json.decode(response.body);
return apiBody;
else
return json.decode(response.body);
catch (e)
这是我通过未来构建器使用 listview.builder 从类 SpeakerApiData 获取“图像”和“数据”的类
class SpeakerStorageJson extends StatefulWidget
SpeakerStorageJson() : super();
@override
_SpeakerStorageJsonState createState() => _SpeakerStorageJsonState();
class _SpeakerStorageJsonState extends State<SpeakerStorageJson>
var apiImages;
var apiImagesList = [];
@override
void initState()
SpeakersApiData().getSpeakerData().then((value)
for (int i = 0; i < value[0]["data"].length; i++)
setState(()
speakersBluetoothNames.add(value[0]["data"][i]["name"]);
);
NetworkImage(
value[0]["data"][i]["image"],
//useDiskCache: true
);
print("filedataseerat $speakersBluetoothNames");
);
super.initState();
@override
Widget build(BuildContext context)
return Scaffold(
body: Container(
color: Colors.white,
child: FutureBuilder(
future: SpeakersApiData().getSpeakerData(),
builder: (context, snapshot)
if (!snapshot.hasData)
return CircularProgressIndicator();
else
print(snapshot.data);
return ListView.builder(
itemCount: snapshot.data!["data"].length,
itemBuilder: (context, index)
final encodeimage = convert.Base64Encoder()
.convert((snapshot.data![0]["data"][index]["image"]));
final decodeimage = convert.base64Decode(encodeimage);
return ListTile(
title: Text(snapshot.data![0]["data"][index]["name"]),
subtitle: Image.memory(decodeimage),
);
);
,
)),
);
但它在 snapshot.data[0] 处显示错误并引发以下错误
The operator '[]' isn't defined for the type 'Object'. Try defining the operator '[]'.
【问题讨论】:
API 响应是什么样的? api 主要提供特定扬声器的名称和图像,同时通过蓝牙连接它们 显示 API 响应格式。 【参考方案1】:我看到您的 Future getSpeakerData 返回一个没有 [] 运算符的 JSONObject。因此,您尝试将该对象用作列表,但这是行不通的。
操作方法如下:How to Deserialize a list of objects from json in flutter
【讨论】:
请详细说明 您必须将 jsonObject 转换为 Iterable。这正是他们在提供的指南中所做的。以上是关于没有为“对象”类型定义运算符“[]”。尝试定义运算符'[]'。在使用 listview builder 显示数据时的主要内容,如果未能解决你的问题,请参考以下文章
没有为“对象”类型定义运算符“[]”。尝试定义运算符'[]'。在使用 listview builder 显示数据时
Flutter:没有为“Object”类型定义运算符“[]”。尝试定义运算符'[]'