使用 flutter 将 api 响应数据存储在 firebase 集合中
Store a api response data in firebase collections using flutter
所以,我一直在向 REST API 发出 post 请求,我想将响应数据存储在 firebase 云存储集合中。
到目前为止我做了什么:
我已经为响应数据创建了模型 class 并编写了一个函数来进行此 post 调用。
我没有收到任何此类错误,但仍然没有在控制台中打印响应,也没有在 firebase 中上传数据。
此外,我已经检查了几乎所有与我的问题相关的 Whosebug 问题。
在此附上我的代码片段:
函数:
//这个函数只是没有被调用我不知道为什么。
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;
}
我在其中调用函数并将数据存储在 firebase 中的小部件
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'),
),
API 响应数据:
{"title": "resume", "body": "Flutter", "userId": 1, "id": 101}
型号Class:
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,
};
}
希望我已经为您提供了必要的信息
我在这个问题上停留了好几天 如果有人能根据我的代码解决我的问题,我将不胜感激。
对于初学者来说,当您发出 post 请求时,您正在寻找的成功代码是 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
。它 returns 以 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,那么 none 在您的 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());
}
所以,我一直在向 REST API 发出 post 请求,我想将响应数据存储在 firebase 云存储集合中。 到目前为止我做了什么: 我已经为响应数据创建了模型 class 并编写了一个函数来进行此 post 调用。
我没有收到任何此类错误,但仍然没有在控制台中打印响应,也没有在 firebase 中上传数据。 此外,我已经检查了几乎所有与我的问题相关的 Whosebug 问题。
在此附上我的代码片段:
函数: //这个函数只是没有被调用我不知道为什么。
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;
}
我在其中调用函数并将数据存储在 firebase 中的小部件
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'),
),
API 响应数据:
{"title": "resume", "body": "Flutter", "userId": 1, "id": 101}
型号Class:
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,
};
}
希望我已经为您提供了必要的信息 我在这个问题上停留了好几天 如果有人能根据我的代码解决我的问题,我将不胜感激。
对于初学者来说,当您发出 post 请求时,您正在寻找的成功代码是 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
。它 returns 以 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,那么 none 在您的 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());
}