Welcome to Passio Nutrition-AI-Module Flutter SDK!
This package provides a collection of pre-built pages, allowing users to effortlessly integrate these pages into your Flutter app. With just a few simple steps, your app can benefit from these ready-made features. Built to work with nutrition_ai.
- Passio Nutrition-AI SDK added data from Open Food Facts (https://en.openfoodfacts.org/). Each food that contains data from Open Food Facts will be marked by public var isOpenFood: Bool.. In case you choose to set 
isOpenFood = trueyou agree to abide by the terms of the Open Food Facts license agreement (https://opendatacommons.org/licenses/odbl/1-0) and their terms of use (https://world.openfoodfacts.org/terms-of-use) and you will have to add to the UI the following license copy: 
"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)"
- To use the SDK sign up at https://www.passio.ai/nutrition-ai. The SDK WILL NOT WORK without a valid SDK key.
 
| Android | iOS | |
|---|---|---|
| Support | SDK 26+ | 13.0+ | 
The module needs the following permissions to work correctly:
Add the following permissions to your AndroidManifest.xml file:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
<application>
    <receiver android:exported="false" android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationReceiver" />
    <receiver android:exported="false" android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationBootReceiver">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
            <action android:name="android.intent.action.MY_PACKAGE_REPLACED"/>
            <action android:name="android.intent.action.QUICKBOOT_POWERON" />
            <action android:name="com.htc.intent.action.QUICKBOOT_POWERON"/>
        </intent-filter>
    </receiver>
</application>Add the following permissions to your Info.plist file:
<key>NSCameraUsageDescription</key>
<string>App requires your camera access to scan the food.</string>
<key>NSLocalNotificationUsageDescription</key>
<string>We use local notifications to remind you of meal times.</string>- Add to top build.gradle file (Project: android)
 
allprojects {
   repositories {
      ...
      flatDir {
         dirs project(':nutrition_ai').file('libs')
      }
   }
}- Add the dependency in 
pubspec.yaml: 
dependencies:
  nutrition_ai_module: ^3.1.0- Import the Passio Nutrition AI Module
 
import 'package:nutrition_ai_module/nutrition_ai_module.dart';- Insert the following line at the location of your choice to initiate the Nutrition AI Module.
 
await NutritionAIModule.instance
    .setPassioConnector(MyPassioConnector()) // This is optional
    .launch(context);- 
setPassioConnector(PassioConnector passioConnector): To use this method, you must provide a
PassioConnectoras a parameter and ensure the implementation of all methods specified within thePassioConnector. By default, the data will be stored in the Local Database. - 
launch(BuildContext context): In order to launch our module, this method requires a
BuildContextas a parameter. You can call this method at your desired launch location, and it returns aFuture. 
- PassioConnector
 
class MyPassioConnector implements PassioConnector {
  // User Profile Methods
  @override
  Future<UserProfileModel?> fetchUserProfile() async {
  }
  @override
  Future<void> updateUserProfile({
    required UserProfileModel userProfile,
    required bool isNew,
  }) async {
  }
  // Record Methods
  @override
  Future<List<FoodRecord>> fetchDayRecords({
    required DateTime dateTime,
  }) async {
  }
  @override
  Future<List<FoodRecord>> fetchRecords({
    required DateTime fromDate,
    required DateTime endDate,
  }) async {
  }
  @override
  Future<void> updateRecord({
    required FoodRecord foodRecord,
    required bool isNew,
  }) async {
  }
  
  @override
  Future<void> deleteRecord({
    required FoodRecord foodRecord,
  }) async {
  }
  
  // Favorite Methods
  @override
  Future<List<FoodRecord>?> fetchFavorites() async {
  }
  @override
  Future<bool> favoriteExists({
    required FoodRecord foodRecord,
  }) async {
  }
  @override
  Future<void> updateFavorite({
    required FoodRecord foodRecord,
    required bool isNew,
  }) async {
  }
  @override
  Future<void> deleteFavorite({
    required FoodRecord foodRecord,
  }) async {
  }
  // Water Methods
  @override
  Future<double> fetchConsumedWater({
    required DateTime dateTime,
  }) async {
  }
  @override
  Future<List<WaterRecord>> fetchWaterRecords({
    required DateTime fromDate,
    required DateTime endDate,
  }) async {
  }
  @override
  Future<void> updateWater({
    required WaterRecord waterRecord,
    required bool isNew,
  }) async {
  }
  @override
  Future<void> deleteWaterRecord({
    required WaterRecord record,
  }) async {
  }
  // Weight Methods
  @override
  Future<double> fetchMeasuredWeight({
    required DateTime dateTime,
  }) async {
  }
  @override
  Future<List<WeightRecord>> fetchWeightRecords({
    required DateTime fromDate,
    required DateTime endDate,
  }) async {
  }
  @override
  Future<void> updateWeight({
    required WeightRecord record,
    required bool isNew,
  }) async {
  }
  @override
  Future<void> deleteWeightRecord({
    required WeightRecord record,
  }) async {
  }
}- FoodRecord
 
class FoodRecord {
  String id = '';
  String passioID;
  String refCode;
  String name;
  String additionalData = '';
  String iconId = '';
  late List<FoodRecordIngredient> ingredients;
  String _selectedUnit = '';
  double _selectedQuantity = zeroQuantity;
  late List<PassioServingSize> servingSizes;
  late List<PassioServingUnit> servingUnits;
  PassioIDEntityType? entityType;
  MealLabel? mealLabel;
  int? _createdAt;
  String? openFoodLicense;
  static const zeroQuantity = 0.00001;
  bool isFavorite = false;
}- FoodRecordIngredient
 
class FoodRecordIngredient {
  String id = '';
  String passioID;
  String refCode;
  String name = '';
  String iconId = '';
  String selectedUnit = '';
  double selectedQuantity = 0;
  late List<PassioServingSize> servingSizes;
  late List<PassioServingUnit> servingUnits;
  PassioNutrients referenceNutrients;
  String? openFoodLicense;
  PassioIDEntityType entityType;
}- UserProfileModel
 
class UserProfileModel {
  String? id;
  String? name;
  int? _age;
  double? _weight;
  double _targetWeight;
  GenderSelection gender;
  MeasurementSystem heightUnit;
  MeasurementSystem weightUnit;
  double _targetWater;
  ActivityLevel? _activityLevel;
  double? _height;
  CalorieDeficit _calorieDeficit;
  PassioMealPlan? _mealPlan;
  int caloriesTarget = 2100;
  int carbsPercentage = 50;
  int proteinPercentage = 25;
  int fatPercentage = 25;
}- WaterRecord
 
class WaterRecord {
  int? id;
  double _waterConsumption;
  final int createdAt;
}- WeightRecord
 
class WeightRecord {
  int? id;
  double _weight;
  final int createdAt;
}The default PassioConnector operates with the Local Database, which means the data can be lost when the app is uninstalled. Therefore, it's your responsibility to store it in a more permanent location if required.
While our package offers a set of pre-built features, we understand that every app is unique. You can easily customize it to match your specific requirements by referring to the nutrition_ai package for additional options.
It would be great for us if the reporter could share the below things to understand the root cause of the issue.
- Library version
 - Code snippet
 - Logs if applicable
 - Device specification like (Manufacturer, OS version, etc)
 - Screenshot/video with steps to reproduce the issue
 
Copyright 2024 Passio Inc