所以,我一直在向 REST API 发出发布请求,我想将响应数据存储在 firebase 云存储集合中。到目前为止我做了什么:我已经为响应数据创建了模型类,并编写了一个函数来进行此后调用。
我没有收到任何此类错误,但仍然没有在控制台中打印响应,也没有在Firebase中上传数据。 另外,我已经检查了几乎所有与我的问题相关的StackOverflow问题。
在此,我附上我的代码片段:
函数://这个函数只是没有被调用我不知道为什么。
final List<KycDetails> _kyc = [];
Dio dio = Dio();
TextEditingController aadhar = TextEditingController();
Future<List<KycDetails>> postData() async {
const String pathUrl = 'https://jsonplaceholder.typicode.com/posts';
dynamic data = {'title': aadhar.text, 'body': 'Flutter', 'userId': 1};
List<KycDetails> details = [];
var response = await dio.post(pathUrl,
data: data,
options: Options(
headers: {'Content-Type': 'application/json; charset=UTF-8'}));
if (response.statusCode == 200) {
print('ok');
var urjson = jsonDecode(response.data);
for (var jsondata in urjson) {
details.add(KycDetails.fromJson(jsondata));
}
}
return details;
}
我在其中调用函数并将数据存储在火库中的小部件
InkWell(
hoverColor: Colors.red,
onTap: () async {
print('API CALLING');
await postData().then((value) {
setState(() {
_kyc.addAll(value);
});
print(value);
});
Map<String, String> data = {
"aadhar": aadhar.text,
"title": _kyc[0].title,
"userId": _kyc[0].userId.toString(),
};
FirebaseFirestore.instance.collection('kyc').add(data);
},
child: const Text('Submit'),
),
接口响应数据:
{"title": "resume", "body": "Flutter", "userId": 1, "id": 101}
型号类别:
class KycDetails {
KycDetails({
required this.title,
required this.body,
required this.userId,
required this.id,
});
String title;
String body;
int userId;
int id;
factory KycDetails.fromJson(Map<String, dynamic> json) => KycDetails(
title: json["title"],
body: json["body"],
userId: json["userId"],
id: json["id"],
);
Map<String, dynamic> toJson() => {
"title": title,
"body": body,
"userId": userId,
"id": id,
};
}
我希望我已经为您提供了必要的信息 我在这个问题上停留了好几天,如果有人能考虑到我的代码解决我的问题,将不胜感激。
对于初学者来说,当您发出发布请求时,您正在寻找的成功代码201
表示已成功创建资源。
因此,此代码块中的任何内容都不会运行。
if (response.statusCode == 200) {
print('ok');
var urjson = jsonDecode(response.data);
for (var jsondata in urjson) {
details.add(KycDetails.fromJson(jsondata));
}
}
response.data
在这里不需要jsonDecode
。它以map
的形式返回,因此您可以这样转换它。
所以这个
var urjson = jsonDecode(response.data);
可以是这个
final urjson = response.data as Map<String, dynamic>;
至于这条线
for (var jsondata in urjson) {
details.add(KycDetails.fromJson(jsondata));
}
响应是单个map
,而不是列表。该单个map
采用KycDetails
模型的形式,因此您无需循环访问任何内容。
因此,您可以使用fromJson
方法创建对象。
final kycDetail = KycDetails.fromJson(urjson);
然后,您可以执行此操作以将正确启动的KycDetails
对象添加到列表中。
details.add(kycDetail);
如果您只想将单个对象添加到Firebase,那么onTap
中这些都不是必需的。此外,尝试访问索引 0 处的属性不会是列表中的最新成员。您需要添加列表中最后一项的索引。
Map<String, String> data = {
"aadhar": aadhar.text,
"title": _kyc[0].title,
"userId": _kyc[0].userId.toString(),
};
FirebaseFirestore.instance.collection('kyc').add(data);
您可以通过postData
功能添加到Firebase。
if (response.statusCode == 201) {
print('ok');
final urjson = response.data as Map<String, dynamic>;
final kycDetail = KycDetails.fromJson(urjson);
details.add(kycDetail);
FirebaseFirestore.instance.collection('kyc').add(kycDetail.toJson());
}