Flutter营养分析插件nutrition_ai的使用

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

Flutter营养分析插件nutrition_ai的使用

概述

欢迎来到Passio Nutrition-AI Flutter SDK!集成到您的应用中后,此SDK将为您提供食物识别和营养助手技术。该SDK旨在接收图像流,并输出这些图像中的食物以及与识别的食物相关的营养数据。

作为开发者,您可以完全控制何时打开/关闭SDK并配置其输出,包括:

  • 食物名称(例如香蕉、汉堡包、水果沙拉、Quest巧克力棒)
  • 识别食物的替代品列表(例如,豆浆是视觉识别类别牛奶的替代品)
  • 食品包装上检测到的条形码
  • 通过食品包装上的文本识别出的包装食品
  • 使用Passio的营养事实阅读器从食品包装上检测到的营养信息,返回写在营养事实标签上的信息
  • 与食物相关的营养信息
  • 某些食物的重量和体积

默认情况下,SDK不会记录或存储任何照片或视频。相反,当最终用户用手机摄像头对准某个食物时,SDK会实时识别和标识食物项目。这种悬停动作仅是暂时的,在最终用户指向特定物品时发生,并且不会被记录或存储在SDK内。作为开发者,您可以配置SDK以捕获图像或视频并在您的应用中存储它们。

在继续之前

  1. Passio Nutrition-AI SDK添加了来自Open Food Facts的数据(https://en.openfoodfacts.org/)。每个包含Open Food Facts数据的食物都会被标记为公共变量isOpenFood: Bool。如果您选择设置isOpenFood = true,则表示您同意遵守Open Food Facts许可协议(https://opendatacommons.org/licenses/odbl/1-0)及其使用条款(https://world.openfoodfacts.org/terms-of-use),并且您需要在UI中添加以下许可副本:

    “This record contains information from Open Food Facts (https://en.openfoodfacts.org), which is made available here under the Open Database License (https://opendatacommons.org/licenses/odbl/1-0))”

  2. 要使用SDK,请访问https://www.passio.ai/nutrition-ai注册。没有有效的SDK密钥,SDK将无法工作。

最低要求

Android iOS
支持 SDK 26+ 13.0+
  • SDK需要访问设备的相机。

初始化和配置SDK

  1. 导入Passio Nutrition AI包:
import 'package:nutrition_ai/nutrition_ai_sdk.dart';
  1. 使用您在https://www.passio.ai/nutrition-ai获取的密钥配置SDK:
void configureSDK() async {
   String passioKey = "Your_PassioSDK_Key";
   var configuration = PassioConfiguration(passioKey);
   passioStatus = await NutritionAI.instance.configureSDK(configuration);
   switch(passioStatus.mode) {
      case PassioMode.notReady: { break; }
      case PassioMode.failedToConfigure: { break; }
      case PassioMode.isBeingConfigured: { break; }
      case PassioMode.isDownloadingModels: { break; }
      case PassioMode.isReadyForDetection: { break; }
   }
}
  1. 请求授权使用相机并添加PassioPreview小部件:
Future<void> _checkPermission() async {
  if (await Permission.camera.request().isGranted) {
    _startFoodDetection();
  }
}

@override
Widget build(BuildContext context) {
  return Scaffold(
    body: Stack(
      children: [
        const PassioPreview(),
        // 其他widget
      ],
    ),
  );
}
  1. 添加方法startFoodDetection()并注册FoodRecognitionListener
void _startFoodDetection() {
  var detectionConfig = FoodDetectionConfiguration();
  detectionConfig.detectBarcodes = true;
  NutritionAI.instance.startFoodDetection(detectionConfig, this);
}

@override
void recognitionResults(FoodCandidates? foodCandidates, PlatformImage? image) {
  // 处理识别结果
}
  1. 在小部件dispose时停止食物检测:
@override
void dispose() {
  NutritionAI.instance.stopFoodDetection();
  super.dispose();
}
  1. 获取营养数据:

根据识别候选人的类型,使用以下两种方法之一获取营养数据:

  • 对于视觉候选人:fetchFoodItemForPassioID
  • 对于条形码和包装食品:fetchFoodItemForProductCode

这两个函数都有一个回调,返回PassioFoodItem对象,如果没有找到数据或网络不可用,则返回null

  1. 搜索功能:

SDK的搜索功能返回给定搜索文本的PassioSearchResponse

Future<PassioSearchResponse> searchForFood(String byText);

PassioSearchResponse提供搜索结果列表和搜索选项列表。

class PassioSearchResponse {
  final List<PassioSearchResult> results;
  final List<String> alternateNames;
}
  • PassioSearchResult持有诸如foodName、brandName、iconID和nutritionPreview等信息。
  • alternateNames提供与给定术语相关的其他搜索词列表。例如,如果搜索词是“apple”,则alternateNames列表可能包括“red apple”、“green apple”、“apple juice”等。

使用fetchSearchResult方法检索给定PassioSearchResult的营养数据。与相机识别结果相同,返回对象是PassioFoodItem

  1. PassioFoodItem

这是顶级对象,包含所有营养信息,如营养素数据、份量大小、数据来源等。

class PassioFoodItem {
   final PassioFoodAmount amount;
   final String details;
   final String iconId;
   final String id;
   final List<PassioIngredient> ingredients;
   final String name;
   final PassioID? scannedId;

   PassioNutrients nutrients(UnitMass unitMass);
   PassioNutrients nutrientsSelectedSize();
   PassioNutrients nutrientsReference();
   UnitMass weight();
   String? isOpenFood();
}
  • details包含有关食品品牌或一般食品类别的信息。
  • PassioFoodAmount可用于获取关联的份量单位和服务尺寸列表。它还用于控制当前选定的数量和单位。
  • 营养数据将存储在PassioIngredient对象中。

示例Demo:

import 'package:flutter/material.dart';
import 'package:nutrition_ai/nutrition_ai_sdk.dart';
import 'package:permission_handler/permission_handler.dart';

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  bool _sdkIsReady = false;
  PassioStatus? _passioStatus;

  @override
  void initState() {
    super.initState();
    configureSDK();
  }

  void configureSDK() async {
    String passioKey = "Your_PassioSDK_Key";
    var configuration = PassioConfiguration(passioKey);
    var status = await NutritionAI.instance.configureSDK(configuration);
    setState(() {
      _passioStatus = status;
      if (status.mode == PassioMode.isReadyForDetection) {
        _sdkIsReady = true;
      }
    });
  }

  Future<void> _checkPermission() async {
    if (await Permission.camera.request().isGranted) {
      _startFoodDetection();
    }
  }

  void _startFoodDetection() {
    var detectionConfig = FoodDetectionConfiguration();
    detectionConfig.detectBarcodes = true;
    NutritionAI.instance.startFoodDetection(detectionConfig, this);
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Nutrition AI Demo')),
        body: !_sdkIsReady
            ? Center(child: CircularProgressIndicator())
            : Column(
                children: [
                  ElevatedButton(
                    onPressed: _checkPermission,
                    child: Text('Start Detection'),
                  ),
                  // Add your UI components for displaying detection results here.
                ],
              ),
      ),
    );
  }

  @override
  void recognitionResults(FoodCandidates? foodCandidates, PlatformImage? image) {
    // Handle recognition results
  }

  @override
  void dispose() {
    NutritionAI.instance.stopFoodDetection();
    super.dispose();
  }
}

请注意,上述代码仅为演示目的,实际应用中可能需要根据具体需求进行调整。


更多关于Flutter营养分析插件nutrition_ai的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter营养分析插件nutrition_ai的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,关于Flutter中的nutrition_ai插件的使用,这里提供一个基本的代码示例来展示如何集成和使用该插件进行营养分析。请注意,实际使用时需要根据nutrition_ai插件的具体文档和API进行调整。由于nutrition_ai可能是一个假想的插件名称或具体实现细节未知,以下代码将基于一个假设的营养分析插件API结构进行说明。

首先,确保你已经在pubspec.yaml文件中添加了nutrition_ai插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  nutrition_ai: ^x.y.z  # 替换为实际的版本号

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

接下来,在你的Flutter应用中,你可以按照以下步骤使用nutrition_ai插件:

1. 导入插件

在你的Dart文件中导入插件:

import 'package:nutrition_ai/nutrition_ai.dart';

2. 初始化插件并进行分析

假设nutrition_ai插件提供了一个NutritionAnalyzer类用于营养分析,你可以这样使用它:

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String analysisResult = '';

  @override
  void initState() {
    super.initState();
    _performNutritionAnalysis();
  }

  Future<void> _performNutritionAnalysis() async {
    // 假设我们有一个食品数据对象
    FoodData foodData = FoodData(
      name: 'Apple',
      ingredients: ['Apple'],
      servingSize: '1 medium',
      calories: 52,
      // 其他营养成分数据...
    );

    // 初始化NutritionAnalyzer
    NutritionAnalyzer analyzer = NutritionAnalyzer();

    try {
      // 执行营养分析
      NutritionAnalysisResult result = await analyzer.analyze(foodData);
      
      // 更新UI
      setState(() {
        analysisResult = 'Nutrition Analysis Result:\n${result.toJson()}';
      });
    } catch (e) {
      // 处理错误
      setState(() {
        analysisResult = 'Error performing nutrition analysis: $e';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Nutrition Analysis Demo'),
        ),
        body: Center(
          child: Text(analysisResult),
        ),
      ),
    );
  }
}

// 假设的食品数据模型
class FoodData {
  String name;
  List<String> ingredients;
  String servingSize;
  int calories;
  // 其他属性...

  FoodData({
    required this.name,
    required this.ingredients,
    required this.servingSize,
    required this.calories,
    // 其他参数...
  });

  // toJson方法用于将对象转换为JSON格式(示例)
  Map<String, dynamic> toJson() {
    return {
      'name': name,
      'ingredients': ingredients,
      'servingSize': servingSize,
      'calories': calories,
      // 其他属性...
    };
  }
}

// 假设的营养分析结果模型
class NutritionAnalysisResult {
  String summary;
  Map<String, double> nutrients;

  NutritionAnalysisResult({
    required this.summary,
    required this.nutrients,
  });

  // toJson方法用于将对象转换为JSON格式(示例)
  Map<String, dynamic> toJson() {
    return {
      'summary': summary,
      'nutrients': nutrients,
    };
  }
}

注意:

  1. 插件API:上述代码中的NutritionAnalyzerFoodDataNutritionAnalysisResult类及其方法是基于假设的。实际使用时,你需要参考nutrition_ai插件的官方文档来了解其API结构和使用方法。

  2. 数据模型FoodDataNutritionAnalysisResult数据模型需要根据插件要求进行调整。

  3. 错误处理:在实际应用中,应添加更详细的错误处理和用户反馈机制。

  4. UI设计:上述示例中的UI设计非常基础,你可以根据需要自定义UI以提升用户体验。

希望这个示例能帮助你开始使用nutrition_ai插件进行营养分析。如果有具体的插件文档或API参考,建议仔细阅读并按照其指导进行实现。

回到顶部