我想在动态数组中使用where方法。我正在从api中获取数据,我想在where方法的帮助下从响应中找到一些数据。
以下是api的repsonse。
[
{
'status': true,
'result': 'found',
'data': [
{
'id': 10676487174744,
'name': 'Taki Rajani',
'email': 'mohamtaki.rai@gmail.com',
'isAdmin': false,
'description': 'ta rai'
},
{
'id': 1172269813061229,
'name': 'Aar Raj',
'email': 'rajnia@gmail.com',
'isAdmin': false,
'description': 'test'
},
{
'id': 12854121,
'name': 'testing',
'email': 'testing1222@gmail.com',
'isAdmin': false,
'description': 'details'
}
]
}
]
以下是我的代码,用于查找存储在storeUserID变量中的相同用户id。
2个问题:-1( 当我打印用户列表时,我得到了案例3中的所有数据,但当我打印此列表的长度时,响应显示计数仅为1。2( ";其中";方法在打印时没有显示任何内容可能不起作用
Future<GetUserData> getUserDetail() async {
var url = "https://aeliya.mydomin.com/getUser.php";
var response = await http.get(Uri.parse(url));
var jsondata = jsonDecode(response.body.toString());
List listOfUser = [];
if (response.statusCode == 200) {
//print(jsondata);
listOfUser.add(jsondata);
print(listOfUser);
print(listOfUser.length);
var findid = listOfUser.where((element) => element == storeUserID);
print(findid);
return GetUserData.fromJson(jsondata);
} else {
return GetUserData.fromJson(jsondata);
}
您的api响应包含一个列表,其中的数据包含您想要的列表。所以改变这个:
if (response.statusCode == 200) {
//print(jsondata);
listOfUser.add(jsondata);
print(listOfUser);
print(listOfUser.length);
var findid = listOfUser.where((element) => element == storeUserID);
print(findid);
return GetUserData.fromJson(jsondata);
} else {
return GetUserData.fromJson(jsondata);
}
到此:
if (response.statusCode == 200) {
print(jsondata['data']);
print(jsondata['data'].length);
var findid = (jsondata['data'] as List)
.where((element) => element['id'] == 1172269813061229);
print(findid);
return GetUserData.fromJson(jsondata['data']);
} else {
return GetUserData.fromJson(jsondata['data']);
}
当我打印此列表的长度时,回复只显示计数1
这是因为在这里listOfUser.add(jsondata);
添加了整个响应体。并且你的响应体是1个对象。
";其中";方法在打印时没有显示任何内容可能不起作用。
您的列表不是User
列表,这就是为什么您的where
方法中的条件element == storeUserID
将始终为false。如果它是假的,那么它将一无所获。
解决方法:
...
var jsondata = jsonDecode(response.body); // do not make it to String. Your response is a LIST
List listOfUser = [];
if (response.statusCode == 200) {
// i assume your response will only have 1 object
final data = jsondata[0]['data'];
listOfUser.add(data);
final findid = listOfUser.where((element) => element['id'] == storeUserID);
print(findid);
return GetUserData();
// return GetUserData.fromJson(jsondata); you have to make sure this is not error. its because your response is an array. not a Map
}else{
throw Exception(response.body);
}
...