使用 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());
  }