For native iOS, install your Amplitude and Adjust SDKs in the same app target that hosts Flowboard, then forward Flowboard callbacks into those SDKs from one small bridge object.
import 'package:amplitude_flutter/amplitude.dart';import 'package:adjust_sdk/adjust.dart';import 'package:adjust_sdk/adjust_config.dart';import 'package:adjust_sdk/adjust_event.dart';import 'package:flutter/material.dart';import 'package:flowboard_flutter/flowboard_flutter.dart';const String adjustStepToken = 'abc123';const String adjustCompleteToken = 'xyz789';final Amplitude amplitude = Amplitude.getInstance();void initTracking() { amplitude.init('AMPLITUDE_API_KEY'); final config = AdjustConfig('ADJUST_APP_TOKEN', AdjustEnvironment.production); Adjust.initSdk(config);}void trackAdjustStep(String stepId, int pageStep) { final event = AdjustEvent(adjustStepToken); event.addCallbackParameter('step_id', stepId); event.addCallbackParameter('page_step', pageStep.toString()); Adjust.trackEvent(event);}void trackAdjustComplete(String? plan) { final event = AdjustEvent(adjustCompleteToken); if (plan != null && plan.isNotEmpty) { event.addCallbackParameter('plan', plan); } Adjust.trackEvent(event);}Future<void> launchTrackedFlow(BuildContext context) async { await Flowboard.launchOnboarding( context, onStepChange: (stepId, pageStep, formData) { final plan = formData['plan'] as String?; amplitude.logEvent('flow_step_viewed', eventProperties: { 'step_id': stepId, 'page_step': pageStep, 'plan': plan, }); if (stepId.isNotEmpty) { trackAdjustStep(stepId, pageStep); } }, onOnboardEnd: (formData) { final plan = formData['plan'] as String?; amplitude.logEvent('flow_completed', eventProperties: { 'plan': plan, 'accepted_terms': formData['accept_terms'] == true, }); trackAdjustComplete(plan); }, );}