使用 Flutter 将 API 响应数据存储在 Firebase 集合中



所以,我一直在向 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());
}

最新更新