Flutter食品信息查询插件openfoodfacts的使用

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

Flutter食品信息查询插件openfoodfacts的使用

Open Food Facts - Dart

Pub Version Run sdk tests likes popularity pub points

Open Food Facts 是一个提供全球超过290万种食品信息的API。该API由来自世界各地的贡献者维护,并且在不断增长。

一般原则,它是如何工作的?

我们利用Open Food Facts API返回JSON格式的产品结果的能力,然后生成易于理解的对象结构,使您能够轻松使用。

此插件还允许您编辑产品或向Open Food Facts上传新产品。通过使用相同简单的产品结构,您可以创建产品对象或编辑现有对象,并使用单个函数将其发送到API。

使用说明

安装

按照 pub.dev 上的安装说明进行操作。

如何认证

对于大多数查询,不需要认证!不过,我们建议设置User-Agent以避免被误封禁。

设置(可选)

在应用程序的开头,可以定义一些全局设置,以便在每个查询中不必指定它们。可以在应用程序生命周期的任何时间覆盖这些静态值。

import 'package:openfoodfacts/openfoodfacts.dart';

OpenFoodAPIConfiguration.userAgent = UserAgent(name: 'Your app name', url: 'Your url, if applicable');

OpenFoodAPIConfiguration.globalLanguages = <OpenFoodFactsLanguage>[
  OpenFoodFactsLanguage.ENGLISH
];

OpenFoodAPIConfiguration.globalCountry = OpenFoodFactsCountry.FRANCE;

所有可能的配置可以在这里找到:OpenFoodAPIConfiguration

功能示例代码

查询产品

Future<Product?> getProduct() async {
  var barcode = '0048151623426';

  final ProductQueryConfiguration configuration = ProductQueryConfiguration(
    barcode,
    language: OpenFoodFactsLanguage.GERMAN,
    fields: [ProductField.ALL],
    version: ProductQueryVersion.v3,
  );
  final ProductResultV3 result =
      await OpenFoodAPIClient.getProductV3(configuration);

  if (result.status == ProductResultV3.statusSuccess) {
    return result.product;
  } else {
    throw Exception('product not found, please insert data for $barcode');
  }
}

添加新产品

void addNewProduct() async {
  // 定义要添加的产品。
  // 更多属性可用 ...
  Product myProduct = Product(
    barcode: '0048151623426',
    productName: 'Maryland Choc Chip',
  );

  // 需要一个注册的用户登录 https://world.openfoodfacts.org/
  User myUser = User(userId: 'max@off.com', password: 'password');

  // 查询OpenFoodFacts API
  Status result = await OpenFoodAPIClient.saveProduct(myUser, myProduct);

  if (result.status != 1) {
    throw Exception('product could not be added: ${result.error}');
  }
}

添加产品图片

void addProductImage() async {
  // 定义产品图片
  // 设置本地图片文件的URI
  // 选择"imageField"作为图像内容的位置/描述。
  SendImage image = SendImage(
    lang: OpenFoodFactsLanguage.ENGLISH,
    barcode: '0048151623426',
    imageField: ImageField.INGREDIENTS,
    imageUri: Uri.parse('Path to you image'),
  );

  // 需要一个注册的用户登录 https://world.openfoodfacts.org/
  User myUser = User(userId: 'max@off.com', password: 'password');

  // 查询OpenFoodFacts API
  Status result = await OpenFoodAPIClient.addProductImage(myUser, image);

  if (result.status != 'status ok') {
    throw Exception(
        'image could not be uploaded: ${result.error} ${result.imageId.toString()}');
  }
}

提取成分

Future<String?> extractIngredient() async {
  // 需要一个注册的用户登录 https://world.openfoodfacts.org/
  User myUser = User(userId: 'max@off.com', password: 'password');

  // 查询OpenFoodFacts API
  OcrIngredientsResult response = await OpenFoodAPIClient.extractIngredients(
      myUser, '0041220576920', OpenFoodFactsLanguage.ENGLISH);

  if (response.status != 0) {
    throw Exception("Text can't be extracted.");
  }
  return response.ingredientsTextFromImage;
}

获取建议

void getSuggestions() async {
  // 结果将是一个可以解析的 List<dynamic>
  await OpenFoodAPIClient.getSuggestions(TagType.COUNTRIES,
      input: 'Tun', language: OpenFoodFactsLanguage.FRENCH);
}

贡献数据

处理Open Food Facts账户

有些修改或输入数据的查询需要用户账户来验证此请求。有两种处理用户账户的方式:

  1. 让用户登录/创建Open Food Facts用户账户(推荐)
  2. 为您的应用创建一个全局用户,所有请求都通过该用户运行

目前没有OAuth工作流,因此用户只是这个包中的一个User对象。你需要从用户那里获取用户名和密码并安全存储。对于Flutter应用,我们推荐使用flutter_secure_storage包。

为了使用户生效,你需要在应用生命周期的某个点挂载一个全局用户:

OpenFoodAPIConfiguration.globalUser = User(
  userId: 'myUsername',
  password: 'myPassword',
);

无论你使用的是全局应用还是每个用户的账户,在挂载后,用户将被添加到可以归因于用户的查询中。

开源许可

数据库在OdBL下。这意味着归属来源并也贡献回任何添加(照片、数据),这使得此包很容易做到。你可以在这里查看使用条款:Terms of use

有用的资源

参与开发

如果你发现此包中有错误或缺少功能,请为此打开一个问题。

支持

如果你遇到超出此包范围的问题,请在Slack上写信给我们或发送电子邮件至contact@openfoodfacts.org

测试

从仓库根目录执行以下命令以运行测试:

dart test

使用此SDK的应用程序

官方应用程序

Open Food Facts(代号Smoothie)是官方开发的应用程序,可在AndroidiOS上使用。源代码也在GitHub上可用。

第三方应用程序

作者

感谢Alexander SchachtPrimaël Quémerais对此包的初始创建。

贡献者

Drag Racing


更多关于Flutter食品信息查询插件openfoodfacts的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter食品信息查询插件openfoodfacts的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用openfoodfacts插件来查询食品信息的代码示例。这个插件允许你访问Open Food Facts数据库,获取食品的详细信息。

首先,你需要在你的Flutter项目中添加openfoodfacts依赖。打开你的pubspec.yaml文件,并添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  openfoodfacts: ^2.0.0  # 请检查最新版本号

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

接下来,你可以在你的Flutter应用中编写代码来使用这个插件。以下是一个简单的示例,展示如何查询食品信息:

import 'package:flutter/material.dart';
import 'package:openfoodfacts/model/product.dart';
import 'package:openfoodfacts/openfoodfacts.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Open Food Facts Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final TextEditingController _controller = TextEditingController();
  Product? _product;
  String _queryResult = "";

  void _searchProduct() async {
    setState(() {
      _queryResult = "Searching...";
    });

    try {
      String barcode = _controller.text.trim();
      if (barcode.isEmpty) {
        setState(() {
          _queryResult = "Barcode cannot be empty.";
          _product = null;
        });
        return;
      }

      Product product = await OpenFoodFacts.getProductByBarcode(barcode);
      setState(() {
        _product = product;
        _queryResult = "";
      });
    } catch (e) {
      setState(() {
        _queryResult = "Error: ${e.message}";
        _product = null;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Open Food Facts Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            TextField(
              controller: _controller,
              decoration: InputDecoration(
                labelText: 'Enter Barcode',
              ),
            ),
            SizedBox(height: 16),
            ElevatedButton(
              onPressed: _searchProduct,
              child: Text('Search Product'),
            ),
            SizedBox(height: 16),
            Text(_queryResult),
            if (_product != null) {
              SizedBox(height: 16),
              Text('Product Name: ${_product!.productName}'),
              Text('Brand: ${_product!.brands}'),
              // 根据需要添加更多产品信息
            }
          ],
        ),
      ),
    );
  }
}

这个示例应用包含以下功能:

  1. 一个输入框,用于输入食品的条形码。
  2. 一个按钮,用于触发查询操作。
  3. 显示查询结果,包括产品信息(如产品名称和品牌)。

你可以根据需求进一步扩展这个示例,比如添加更多的产品信息展示,或者处理查询失败时的不同情况。

请注意,这个示例假设你已经正确设置了Flutter开发环境,并且已经安装并配置了所有必要的依赖。在实际项目中,你可能还需要处理更多的边缘情况和错误处理逻辑。

回到顶部