Flutter数据操作插件airtable_crud的使用

发布于 1周前 作者 bupafengyu 来自 Flutter

Flutter数据操作插件airtable_crud的使用

Airtable CRUD Flutter Plugin

Airtable CRUD Flutter Plugin 是一个强大的解决方案,用于将 Airtable 的 API 与您的 Flutter 应用程序集成。它使开发人员能够无缝地执行基本的 CRUD 操作和过滤记录。

Features

  • Fetch Records: 从指定表中检索所有记录。
  • Fetch Records with Filter: 使用 Airtable 的 filterByFormula 根据条件检索特定记录。
  • Create Records: 轻松添加新记录到您的 Airtable 表。
  • Bulk Create Records: 批量创建多个记录,提高效率。
  • Update Records: 修改现有记录。
  • Delete Records: 从您的 Airtable 表中删除记录。
  • Pagination Support: 使用分页选项检索记录。
  • View Selection: 在检索记录时选择视图,默认设置为 Grid View

Getting Started

Installation

pubspec.yaml 文件中添加以下依赖项:

dependencies:
  airtable_crud: ^1.0.0  # Replace with the latest version from pub.dev

然后运行 flutter pub get 来安装该包。

Usage

  1. Import the plugin:

    import 'package:airtable_plugin/airtable_crud.dart';
    
  2. Initialize the Airtable CRUD:

    final airtableCrud = AirtableCrud('YOUR_AIRTABLE_API_KEY', 'YOUR_BASE_ID');
    
  3. Fetch Records:

    // Fetch all records with optional pagination and view selection
    final records = await airtableCrud.fetchRecords('your_table_name', view: 'your_view_name');
    

    Example:

    final records = await airtableCrud.fetchRecords('Contacts', view: 'All Contacts');
    
  4. Fetch Records with Filter:

    final filteredRecords = await airtableCrud.fetchRecordsWithFilter(
      'your_table_name',
      "AND({lastname} = 'Smith', {status} = 'Active')",
      view: 'Active Contacts',
    );
    

    Example:

    final filteredRecords = await airtableCrud.fetchRecordsWithFilter(
      'Contacts',
      "AND({lastname} = 'Smith', {status} = 'Active')",
      view: 'Active Contacts',
    );
    
  5. Create a Record:

    final newRecord = {
      'firstname': 'Jane',
      'lastname': 'Doe',
      'email': 'jane.doe@example.com',
    };
    final createdRecord = await airtableCrud.createRecord('Contacts', newRecord);
    
  6. Bulk Create Records:

    final dataList = [
      {
        'firstname': 'Charlie',
        'lastname': 'Brown',
        'email': 'charlie.brown@example.com',
      },
      {
        'firstname': 'Diana',
        'lastname': 'Prince',
        'email': 'diana.prince@example.com',
      },
    ];
    final createdRecords = await airtableCrud.createBulkRecords('Contacts', dataList);
    
  7. Update a Record:

    recordToUpdate.fields['email'] = 'new.email@example.com';
    await airtableCrud.updateRecord('Contacts', recordToUpdate);
    
  8. Delete a Record:

    await airtableCrud.deleteRecord('Contacts', 'rec1234567890ABC');
    

Error Handling

try {
  final records = await airtableCrud.fetchRecords('your_table_name');
} on AirtableException catch (e) {
  print('Error: ${e.message}');
  print('Details: ${e.details}');
}

Query Builder

使用 AirtableQueryBuilder 动态构建复杂的查询公式:

final queryBuilder = AirtableQueryBuilder()
    .where({'Status': 'Pending'})
    .and({'Priority': 'High'})
    .or({'Assignee': 'John Doe'})
    .and({'Category': 'Development'})
    .or({'DueDate': '2024-01-01'});

final records = await airtableCrud.fetchRecordsWithQueryBuilder(
  'Tasks',
  queryBuilder,
  view: 'Grid view',
);

示例代码

下面是一个完整的示例应用,展示了如何使用 airtable_crud 插件进行数据操作:

import 'package:flutter/material.dart';
import 'package:airtable_crud/airtable_crud.dart';
import 'package:airtable_crud/models/airtable_record.dart';

void main() {
  runApp(AirtableExampleApp());
}

class AirtableExampleApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Airtable CRUD Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: AirtableHomePage(),
    );
  }
}

class AirtableHomePage extends StatefulWidget {
  @override
  _AirtableHomePageState createState() => _AirtableHomePageState();
}

class _AirtableHomePageState extends State<AirtableHomePage> {
  final String apiKey = 'YOUR_AIRTABLE_API_KEY'; 
  final String baseId = 'YOUR_BASE_ID'; 
  final String tableName = 'YOUR_TABLE_NAME'; 

  late AirtableCrud airtableCrud;
  List<AirtableRecord> records = [];
  bool isLoading = true;

  @override
  void initState() {
    super.initState();
    airtableCrud = AirtableCrud(apiKey, baseId);
    fetchRecords();
  }

  Future<void> fetchRecords() async {
    setState(() {
      isLoading = true;
    });

    try {
      List<AirtableRecord> fetchedRecords = await airtableCrud.fetchRecords(tableName);
      setState(() {
        records = fetchedRecords;
        isLoading = false;
      });
    } catch (e) {
      print('Error fetching records: $e');
      setState(() {
        isLoading = false;
      });
    }
  }

  Future<void> createRecord() async {
    final newRecord = {
      'firstname': 'New',
      'lastname': 'User',
      'email': 'new.user@example.com',
    };

    try {
      await airtableCrud.createRecord(tableName, newRecord);
      await fetchRecords();
    } catch (e) {
      print('Error creating record: $e');
    }
  }

  Future<void> bulkCreateRecords() async {
    final dataList = [
      {
        'firstname': 'Bulk',
        'lastname': 'User1',
        'email': 'bulk.user1@example.com',
      },
      {
        'firstname': 'Bulk',
        'lastname': 'User2',
        'email': 'bulk.user2@example.com',
      },
    ];

    try {
      await airtableCrud.bulkCreateRecords(tableName, dataList);
      await fetchRecords();
    } catch (e) {
      print('Error bulk creating records: $e');
    }
  }

  Future<void> updateRecord(AirtableRecord record) async {
    record.fields['lastname'] = 'Updated';

    try {
      await airtableCrud.updateRecord(tableName, record);
      await fetchRecords();
    } catch (e) {
      print('Error updating record: $e');
    }
  }

  Future<void> deleteRecord(String id) async {
    try {
      await airtableCrud.deleteRecord(tableName, id);
      await fetchRecords();
    } catch (e) {
      print('Error deleting record: $e');
    }
  }

  Widget buildRecordList() {
    return ListView.builder(
      itemCount: records.length,
      itemBuilder: (context, index) {
        AirtableRecord record = records[index];
        return ListTile(
          title: Text(record.fields['firstname'] ?? 'No Name'),
          subtitle: Text(record.fields['email'] ?? ''),
          trailing: Row(
            mainAxisSize: MainAxisSize.min,
            children: [
              IconButton(
                icon: Icon(Icons.edit),
                onPressed: () => updateRecord(record),
              ),
              IconButton(
                icon: Icon(Icons.delete),
                onPressed: () => deleteRecord(record.id),
              ),
            ],
          ),
        );
      },
    );
  }

  Widget buildLoading() {
    return Center(child: CircularProgressIndicator());
  }

  Widget buildContent() {
    if (isLoading) {
      return buildLoading();
    } else {
      return buildRecordList();
    }
  }

  void showActionsDialog() {
    showDialog(
      context: context,
      builder: (BuildContext context) {
        return AlertDialog(
          title: Text('Select Action'),
          content: SingleChildScrollView(
            child: ListBody(
              children: <Widget>[
                ElevatedButton(
                  onPressed: () {
                    Navigator.of(context).pop();
                    createRecord();
                  },
                  child: Text('Create Single Record'),
                ),
                ElevatedButton(
                  onPressed: () {
                    Navigator.of(context).pop();
                    bulkCreateRecords();
                  },
                  child: Text('Bulk Create Records'),
                ),
              ],
            ),
          ),
        );
      },
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Airtable CRUD Example'),
      ),
      body: buildContent(),
      floatingActionButton: FloatingActionButton(
        onPressed: () => showActionsDialog(),
        child: Icon(Icons.add),
      ),
    );
  }
}

以上是 airtable_crud 插件的基本使用方法和一个完整的示例应用。希望对您有所帮助!


更多关于Flutter数据操作插件airtable_crud的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter数据操作插件airtable_crud的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter中使用airtable_crud插件进行数据操作的代码示例。airtable_crud是一个用于与Airtable API交互的Flutter插件。请注意,为了使用这个插件,你需要先在Airtable中创建一个表,并获取相应的API密钥和表名。

首先,确保在你的pubspec.yaml文件中添加airtable_crud依赖:

dependencies:
  flutter:
    sdk: flutter
  airtable_crud: ^latest_version  # 请替换为实际的最新版本号

然后运行flutter pub get来安装依赖。

接下来,你可以按照以下步骤在Flutter应用中使用airtable_crud插件进行数据操作:

1. 初始化Airtable客户端

在你的Flutter应用的入口文件(通常是main.dart)或适当的初始化位置,配置并初始化Airtable客户端:

import 'package:flutter/material.dart';
import 'package:airtable_crud/airtable_crud.dart';

void main() {
  // 初始化Airtable客户端
  final airtable = AirtableCrud(
    apiKey: 'YOUR_AIRTABLE_API_KEY', // 替换为你的Airtable API密钥
    baseId: 'YOUR_AIRTABLE_BASE_ID', // 替换为你的Airtable Base ID
    tableName: 'YourTableName',      // 替换为你的Airtable表名
  );

  runApp(MyApp(airtable: airtable));
}

class MyApp extends StatelessWidget {
  final AirtableCrud airtable;

  MyApp({required this.airtable});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeScreen(airtable: airtable),
    );
  }
}

2. 创建记录

在你的HomeScreen或其他屏幕中,添加创建记录的功能:

import 'package:flutter/material.dart';
import 'dart:convert';

class HomeScreen extends StatefulWidget {
  final AirtableCrud airtable;

  HomeScreen({required this.airtable});

  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  final TextEditingController _nameController = TextEditingController();
  final TextEditingController _emailController = TextEditingController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Airtable CRUD Operations'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            TextField(
              controller: _nameController,
              decoration: InputDecoration(labelText: 'Name'),
            ),
            TextField(
              controller: _emailController,
              decoration: InputDecoration(labelText: 'Email'),
            ),
            ElevatedButton(
              onPressed: () async {
                Map<String, dynamic> record = {
                  'Name': _nameController.text,
                  'Email': _emailController.text,
                };

                try {
                  var response = await widget.airtable.createRecord(record);
                  print('Record created: $response');
                } catch (e) {
                  print('Error creating record: $e');
                }
              },
              child: Text('Create Record'),
            ),
            // 其他按钮和操作可以添加在这里
          ],
        ),
      ),
    );
  }

  @override
  void dispose() {
    _nameController.dispose();
    _emailController.dispose();
    super.dispose();
  }
}

3. 读取记录

同样地,你可以添加读取记录的功能:

// 在_HomeScreenState类中添加一个读取记录的函数和按钮

class _HomeScreenState extends State<HomeScreen> {
  // ... 之前的代码 ...

  Future<void> fetchRecords() async {
    try {
      var records = await widget.airtable.listRecords();
      print('Records fetched: $records');
      // 你可以在这里更新UI来显示记录
    } catch (e) {
      print('Error fetching records: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      // ... 之前的代码 ...
      body: Padding(
        // ... 之前的代码 ...
        child: Column(
          children: [
            // ... 之前的代码 ...
            ElevatedButton(
              onPressed: fetchRecords,
              child: Text('Fetch Records'),
            ),
            // 其他按钮和操作可以添加在这里
          ],
        ),
      ),
    );
  }
}

4. 更新和删除记录

类似地,你可以添加更新和删除记录的功能。以下是更新记录的示例:

// 假设你已经有了记录的ID
String recordId = 'REC_YOUR_RECORD_ID'; // 替换为实际的记录ID

Future<void> updateRecord() async {
  Map<String, dynamic> updatedFields = {
    'Name': 'Updated Name', // 替换为你想更新的字段和值
  };

  try {
    var response = await widget.airtable.updateRecord(recordId, updatedFields);
    print('Record updated: $response');
  } catch (e) {
    print('Error updating record: $e');
  }
}

删除记录的示例:

Future<void> deleteRecord() async {
  try {
    var response = await widget.airtable.deleteRecord(recordId);
    print('Record deleted: $response');
  } catch (e) {
    print('Error deleting record: $e');
  }
}

在UI中添加相应的按钮来触发这些操作:

// 在_HomeScreenState类的build方法中

@override
Widget build(BuildContext context) {
  return Scaffold(
    // ... 之前的代码 ...
    body: Padding(
      // ... 之前的代码 ...
      child: Column(
        children: [
          // ... 之前的代码 ...
          ElevatedButton(
            onPressed: updateRecord,
            child: Text('Update Record'),
          ),
          ElevatedButton(
            onPressed: deleteRecord,
            child: Text('Delete Record'),
          ),
          // 其他按钮和操作可以添加在这里
        ],
      ),
    ),
  );
}

请确保在实际应用中处理用户输入验证、错误处理和UI更新等细节。这个示例仅展示了基本的CRUD操作,你可以根据实际需求进行扩展和修改。

回到顶部