Flutter食品信息查询插件openfoodfacts的使用
Flutter食品信息查询插件openfoodfacts的使用
Open Food Facts - Dart
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账户
有些修改或输入数据的查询需要用户账户来验证此请求。有两种处理用户账户的方式:
- 让用户登录/创建Open Food Facts用户账户(推荐)
- 为您的应用创建一个全局用户,所有请求都通过该用户运行
目前没有OAuth工作流,因此用户只是这个包中的一个User
对象。你需要从用户那里获取用户名和密码并安全存储。对于Flutter应用,我们推荐使用flutter_secure_storage包。
为了使用户生效,你需要在应用生命周期的某个点挂载一个全局用户:
OpenFoodAPIConfiguration.globalUser = User(
userId: 'myUsername',
password: 'myPassword',
);
无论你使用的是全局应用还是每个用户的账户,在挂载后,用户将被添加到可以归因于用户的查询中。
开源许可
数据库在OdBL下。这意味着归属来源并也贡献回任何添加(照片、数据),这使得此包很容易做到。你可以在这里查看使用条款:Terms of use
有用的资源
- 新API列表:API文档
- 新OpenAPI文档:API文档
- 加入我们的Slack:Open Food Facts Slack
参与开发
如果你发现此包中有错误或缺少功能,请为此打开一个问题。
支持
如果你遇到超出此包范围的问题,请在Slack上写信给我们或发送电子邮件至contact@openfoodfacts.org
测试
从仓库根目录执行以下命令以运行测试:
dart test
使用此SDK的应用程序
官方应用程序
Open Food Facts(代号Smoothie)是官方开发的应用程序,可在Android和iOS上使用。源代码也在GitHub上可用。
第三方应用程序
作者
感谢Alexander Schacht和Primaël Quémerais对此包的初始创建。
贡献者
更多关于Flutter食品信息查询插件openfoodfacts的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于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}'),
// 根据需要添加更多产品信息
}
],
),
),
);
}
}
这个示例应用包含以下功能:
- 一个输入框,用于输入食品的条形码。
- 一个按钮,用于触发查询操作。
- 显示查询结果,包括产品信息(如产品名称和品牌)。
你可以根据需求进一步扩展这个示例,比如添加更多的产品信息展示,或者处理查询失败时的不同情况。
请注意,这个示例假设你已经正确设置了Flutter开发环境,并且已经安装并配置了所有必要的依赖。在实际项目中,你可能还需要处理更多的边缘情况和错误处理逻辑。