如何使用Flutter在Airtable中读取和写入数据?

问题描述

依赖关系: 航空表:^ 0.0.2 导入'package:airtable / airtable.dart'; ??

import'package:dart_airtable / dart_airtable.dart'; ??

void main() async {
  final apiKey = 'my-airtable-api-key'
  final projectBase = 'my-airtable-project-base';
  final recordName = 'Tasks';

  var airtable = Airtable(apiKey: apiKey,projectBase: projectBase);
  var records = await airtable.getAllRecords(recordName);

  print(records);
}

如果有人知道如何解决,我将非常感激。

解决方法

首先,似乎您将两件事混合在一起。当前有两个packages提供了用于与airtable进行通信的库:airtable 0.0.2dart_airtable 0.1.1

在示例代码中,您将import语句用于第一个package,但使用第二个代码。由于第一个没有提供指向repository的有效链接,因此我将看第二个。

要从API检索项目的records,可以使用以下代码:

var records = await airtable.getAllRecords(recordName);

很遗憾,package有一些错误。当我想创建记录时,我使用了createRecord方法,如下所示:

var test = await airtable.createRecord(
  recordName,AirtableRecord(
    fields: [
      AirtableRecordField(
        fieldName: 'Short Description',value: 'Test Description',),],);

print(test);

但是我唯一得到的responsenull。因此,我克隆了项目并调试了方法。结果是这样的:

{"error":{"type":"INVALID_REQUEST_UNKNOWN","message":"Invalid request: parameter validation failed. Check your request data."}}

经过一番搜索,我发现package向airtable API发送了错误的数据。在toJson模型的AirtableRecord方法中,作者添加了不必要的字段idcreatedTime。删除它们后,该方法将起作用。

响应:

AirtableRecord(id: rec9bqN78Le1dbC1g,createdTime: 2020-10-20 19:10:21.000Z,fields: {Short Description: Test Description})

我没有寻找其余的方法,但是我的建议是编写自己的通话时间API连接或使用现有的package并更改不起作用的内容。希望对您有帮助。

编辑:

我将再次检查repository,看来作者不活跃。由于它仅包含一些与airtable API一起使用的方法和模型,因此我认为只编写自己的实现并不是一个坏主意。

下面是一个简单的示例(使用Dio进行网络连接):

try {
  final response = await Dio().post(
    'https://api.airtable.com/v0/$projectBase/$recordName',options: Options(
      contentType: 'Application/json',headers: {
        'Authorization': 'Bearer $yourApiKey','Accept': 'Application/json',},data: {
      'records': [
        {
          'fields': {
            'Short Description': 'Cactus','Total': 11.5,}
        },);

  // TODO: Whatever you want to do with the response. A good practice is to transform it into models and than work with them
  print(response);
} on DioError catch (e) {
  // TODO: Error handling
  if (e.response != null) {
    print(e.response.data);
  } else {
    print(e.request);
    print(e.message);
  }
}

响应:

{"records":[{"id":"recrvxH93gJgAGo7j","fields":{"Short Description":"Cactus","Total":11.5},"createdTime":"2020-10-21T20:41:19.000Z"}]}

您现在可以使用GetIt软件包将其扩展为service,并添加所需的功能。我明确建议您也将models用于response(请看this)。

我使用了他们的示例工作区之一。 projectBase是一个ID。您只需查看他们的API文档,即可了解如何构建requests

编辑2:

阅读可以通过以下方式简单完成:

final response = await Dio().get(
    'https://api.airtable.com/v0/$projectBase/$recordName',);

更新:

final response = await Dio().patch(
    'https://api.airtable.com/v0/$projectBase/$recordName',data: {
      'records': [
        {
          'id': 'rechYkD0pDW1NjFAF','fields': {
            'Short Description': 'Cactus II',);

然后删除:

final response = await Dio().delete(
    'https://api.airtable.com/v0/$projectBase/$recordName/rec0bMv507juqS7pv',options: Options(
      headers: {
        'Authorization': 'Bearer $yourApiKey',);

这些只是示例,我建议您也阅读API文档以获得可能的概述。还有您自己的实现以及适当的错误处理。

编辑3:

您可以使用filterByFormula参数来检索所有符合条件(Reference)的数据。

例如:

final response = await Dio().get(
    'https://api.airtable.com/v0/$projectBase/$recordName',queryParameters: {
      'filterByFormula': 'SEARCH("Cactus",{Short Description})' // Searches the value 'Cactus' in the 'Short description' field.
    },);