没有为“对象”类型定义运算符“[]”。尝试定义运算符'[]'。在使用 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”类型定义运算符“[]”。尝试定义运算符'[]'

//没有为类型'Object'定义运算符'[]'。? [复制]

没有为类“对象”定义运算符“[]”。扑

未为类型定义运算符“[]”尝试定义运算符“[]”

未为“对象”类型定义运算符“[]”[重复]