首页 > 解决方案 > 我在 josn.decode(resp) 上遇到错误(错误:需要一个“字符串”类型的值,但得到一个“列表”类型的值' 什么时候 )

问题描述

这是我试图执行的代码.............
帮我解决这个问题..

我尝试了很多方法来寻找这个解决方案,但我无法解决它。

抛出的错误是

需要一个“字符串”类型的值,但得到一个“列表”类型的值

我的颤振细节是:

version: 1.0.0+1

environment:
  sdk: ">=2.7.0 <3.0.0"
dependencies:
  flutter:
    sdk: flutter

  cupertino_icons: ^1.0.2  
  
  dio: ^3.0.10

class SearchList extends StatefulWidget {
      @override
      _SearchListState createState() => _SearchListState();
    }
    
    class _SearchListState extends State<SearchList> {
      String _url = "https://jsonplaceholder.typicode.com/comments?postId=1";
      TextEditingController _textcontroler = TextEditingController();
      StreamController _streamController;
      Stream _stream;          
      JsonCodec codec = new JsonCodec();
    
      _serch() async {
    if (_textcontroler.text == null || _textcontroler.text.length == 0) {
      return _streamController.add(null);
    } else {
      try {
        Map<String, String> requestheader = {"Accept": "application/json"};
        final response = await Dio().get(_url, queryParameters: requestheader);
        final jsondata = response.data;

        var decoded = json.decode(jsondata);
        //here I got error 
        /// Error: Expected a value of type 'String', but got one of type 'List<dynamic>'
        /// I AM stuck here I was tried by making a class but the error was the same...

        print(decoded);
        return _streamController.add(decoded);
      } catch (e) {
        print("Error: $e");
      }
    }
  }
    
      @override
      void initState() {
        super.initState();
        _streamController = StreamController();
        _stream = _streamController.stream;
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text("Item Name"),
            bottom: PreferredSize(
              preferredSize: Size.fromHeight(40),
              child: Row(
                children: [
                  Expanded(
                      child: Container(
                    child: TextFormField(
                      controller: _textcontroler,
                      onChanged: (String text) {
                        _serch();
                      },
                      decoration: InputDecoration(
                          hintText: "Enter Item Name",
                          contentPadding: const EdgeInsets.only(left: 24),
                          border: InputBorder.none),
                    ),
                  ))
                ],
              ),
            ),
          ),
          body: Container(
            child: StreamBuilder(
              stream: _stream,
              builder: (BuildContext context, AsyncSnapshot snapshot) {
                if (snapshot.data == null) {
                  return Text("Enter Some data");
                }
                return ListView.builder(
                  itemCount: snapshot.data["name"].length,
                  itemBuilder: (BuildContext context, int index) {
                    var alldata = snapshot.data[index];
                    return ListTile(
                      title: alldata["name"],
                    );
                  },
                );
              },
            ),
          ),
        );
      }
    }

标签: flutterdart

解决方案


您收到错误的原因是您调用json.decode它需要一个 json 字符串,但您已经有一个解码的List<dynamic>. Dio在内部解码您的响应并将解码后的输出返回给您。

您可以直接使用response.data或类型转换它以获得更好的 IntelliSense,如下所示:

final jsonData = response.data as List<Map<String,dynamic>>; //<-- converts List<dynamic> to List<Map<String,dynamic>>

return _streamController.add(jsonData); //<-- Use jsonData directly

如果您想从 API 响应中访问帖子详细信息,您可以像这样访问每个地图:

jsonData.forEach((postMap){
  print("postId: ${postMap["postId"]}");
  print("id: ${postMap["id"]}");
  print("name: ${postMap["name"]}");
  print("email: ${postMap["email"]}");
  print("body: ${postMap["body"]}");
});

推荐阅读