【发布时间】: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 响应格式。
标签: android flutter dart flutter-dependencies dart-pub