【问题标题】:How to read and write Data in Airtable with Flutter?如何使用 Flutter 在 Airtable 中读写数据?
【发布时间】:2020-10-11 10:42:58
【问题描述】:

依赖: 空气表:^0.0.2 导入“包:airtable/airtable.dart”; ??

导入'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);
}

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

【问题讨论】:

  • 那么插件有什么问题呢?你遇到了什么问题?
  • 它对我不起作用。我不知道如何将特定表读入基础,或者如何在特定表中创建记录。可以举个例子吗?

标签: flutter airtable


【解决方案1】:

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

在您的示例代码中,您对第一个 package 使用 import 语句,但使用第二个中的代码。由于第一个没有提供指向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 发送了错误的数据。在AirtableRecord模型的toJson方法中,作者添加了不必要的字段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',
    options: Options(
      contentType: 'Application/json',
      headers: {
        'Authorization': 'Bearer $yourApiKey',
        'Accept': 'Application/json',
      },
    ),
  );

更新:

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

然后删除:

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

这些只是示例,我建议您还阅读 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.
    },
    options: Options(
      headers: {
        'Authorization': 'Bearer $yourApiKey',
        'Accept': 'Application/json',
      },
    ),
  );

【讨论】:

  • 马蒂亚斯!非常感谢你!你能给我一个关于如何制作代码的完整示例,以便我可以复制和粘贴它。因为我不明白如何实现它。结果我一直为空。 “createdTime”对于我需要做的事情可能非常有用。如果您将其添加到解释中,那就太好了。
  • 另外我不明白我必须在 projectBase 中写什么,名字?身份证?那桌子呢?每个base里面有很多table,如何配置具体的Table?
  • 非常感谢它工作得很好!!我可以添加记录,但现在,如何读取/更新或删除特定记录?
  • 非常感谢!最后一个问题,我不再打扰你了。我正在制作一个“优惠券系统。我需要当用户插入字符串代码”时,系统会读取在名为“codes”的特定字段中搜索代码的数据,然后还读取同一行中的“date”字段以检查活力。基本上,您知道如何仅使用字段的字符串数据(代码)获取行的特定ID吗?
  • 我可以自己解决。多亏了你,我完成了应用程序。我万分感激!!谢谢!!
猜你喜欢
  • 2020-09-06
  • 1970-01-01
  • 1970-01-01
  • 2019-06-04
  • 2019-05-29
  • 2020-10-03
  • 2012-05-09
  • 1970-01-01
  • 2022-08-20
相关资源
最近更新 更多