flutter - 我在 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"],
);
},
);
},
),
),
);
}
}
解决方案
您收到错误的原因是您调用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"]}");
});
推荐阅读
- c# - C# 中的动态浮点格式化程序
- c# - 没有可用的测试..通过 exe 在 VM 上使用构建工具和测试代理进行测试
- python - 播放带有 winsound 问题的随机 wav 文件
- html - 媒体查询无法在 Opera mini 浏览器上运行,但在 Firefox 和 chrome 浏览器上运行良好
- azure - 是否可以使用 onPremisesSyncEnabled(Microsoft Graph API)来监视 Azure AD 是否同步?
- node.js - 为什么会出现“0 - 未知错误 [object ProgressEvent]”错误?
- c# - 按组在单独的线程中运行处理
- git - 在 Git 中为多个推送提交只创建一个提交
- r - 使用循环导入许多文件
- html - HTML & HUBL:如何添加页码