【问题标题】: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 响应格式。

标签: android flutter dart flutter-dependencies dart-pub


【解决方案1】:

我看到您的 Future getSpeakerData 返回一个没有 [] 运算符的 JSONObject。因此,您尝试将该对象用作列表,但这是行不通的。

操作方法如下:How to Deserialize a list of objects from json in flutter

【讨论】:

  • 请详细说明
  • 您必须将 jsonObject 转换为 Iterable。这正是他们在提供的指南中所做的。
猜你喜欢
  • 2021-05-11
  • 2021-10-07
  • 1970-01-01
  • 1970-01-01
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
  • 2021-04-03
  • 1970-01-01
相关资源
最近更新 更多