flutter_ai_indoor_navigation 0.4.0 copy "flutter_ai_indoor_navigation: ^0.4.0" to clipboard
flutter_ai_indoor_navigation: ^0.4.0 copied to clipboard

A Flutter wrapper for the Combain AI Navigation SDK.

example/lib/main.dart

import 'package:flutter_ai_indoor_navigation_example/comabin_logger.dart';
import 'package:flutter_ai_indoor_navigation_example/components/map/map.dart';
import 'package:flutter_ai_indoor_navigation_example/models/api.dart';
import 'package:flutter_ai_indoor_navigation_example/models/log_store.dart';
import 'package:flutter_ai_indoor_navigation_example/models/preferences.dart';
import 'package:flutter_ai_indoor_navigation_example/models/route_generator.dart';
import 'package:flutter_ai_indoor_navigation_example/theme.dart';
import 'package:flutter/material.dart';
import 'package:flutter_ai_indoor_navigation/flutter_ai_indoor_navigation_sdk.dart';
import 'package:flutter_ai_indoor_navigation/messages.g.dart';
import 'package:get_it/get_it.dart';
import 'package:logger/logger.dart';
import 'package:sentry_flutter/sentry_flutter.dart';

final getIt = GetIt.instance;
late FlutterAIIndoorNavigationSDK aiIndoorNavigationSDK;

class LogOutputWrapper extends ConsoleOutput {
  SentryLevel _toSentryLevel(Level level) {
    switch (level) {
      case Level.info:
        return SentryLevel.info;
      case Level.warning:
        return SentryLevel.warning;
      case Level.error:
        return SentryLevel.error;
      case Level.fatal:
        return SentryLevel.fatal;
      default:
        return SentryLevel.debug;
    }
  }

  @override
  void output(OutputEvent event) {
    if (event.level == Level.error) {
      Sentry.captureMessage(event.lines.join("\n"), level: SentryLevel.error);
    } else {
      Sentry.addBreadcrumb(
        Breadcrumb(
          level: _toSentryLevel(event.level),
          message: event.lines.join("\n"),
        ),
      );
    }
    super.output(event);
  }
}

var logger = Logger(
  //filter: TestLogFilter(),
  printer: PrettyPrinter(
    dateTimeFormat: DateTimeFormat.onlyTimeAndSinceStart,
    methodCount: 4,
    errorMethodCount: 4,
  ),
  output: LogOutputWrapper(),
);

final combainLogger = CustomCombainLogger(logger: logger);
Future setupGetIt() async {
  final prefs = await Preferences.create();
  GetIt.I.registerSingleton<Preferences>(prefs);
  GetIt.I.registerLazySingleton(() => API());
  getIt.registerLazySingleton<Logger>(() => logger);
  getIt.registerLazySingleton(() => const MapView());
  getIt.registerLazySingleton(() => LogStore());
}

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await setupGetIt();

  await SentryFlutter.init((options) {
    options.dsn =
        'https://7d3eca5d39954acb6f63659b9be82d70@o4506755576430592.ingest.us.sentry.io/4507612717252608';
    // Set tracesSampleRate to 1.0 to capture 100% of transactions for performance monitoring.
    // We recommend adjusting this value in production.
    options.tracesSampleRate = 1.0;
    // The sampling rate for profiling is relative to tracesSampleRate
    // Setting to 1.0 will profile 100% of sampled transactions:
    options.profilesSampleRate = 1.0;
  }, appRunner: () => runApp(const MyApp()));
}

Future<void> initIndoorNavigationSDK() async {
  final prefs = GetIt.I<Preferences>();

  var config = FlutterAIIndoorNavigationSDKConfig(
    apiKey: prefs.apiKey!,
    settingsKey: prefs.apiKey!,
    logger: combainLogger,
    routingConfig: FlutterRoutingConfig(
      routableNodesOptions: FlutterRoutableNodesOptions.allExceptDefaultName,
    ),
    syncingInterval: prefs.syncingInterval,
    scanningConfig: prefs.scanningConfig,
  );
  logger.i("Creating SDK with config: $config.syncingInterval");

  aiIndoorNavigationSDK = await FlutterAIIndoorNavigationSDK.create(config);
  getIt.registerSingleton<FlutterAIIndoorNavigationSDK>(aiIndoorNavigationSDK);
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Your App Name',
      theme: AppTheme.getTheme(),
      onGenerateRoute: RouteGenerator.generateRoute,
    );
  }
}