Flutter SDK

Das Flutter SDK ist die primaere Attriax-Laufzeitimplementierung und der beste Einstiegspunkt, wenn Sie erstklassige mobile Attribution, Deep Links und Lifecycle-Tracking moechten.

Paket-Oberflaeche

Allgemeiner Leitfaden fuer attriax_flutter. Verwenden Sie den Projektarbeitsbereich, wenn Sie detaillierte Setup-Schritte, Release-Kontext und projektspezifische Werte benoetigen.

Wofuer Teams es verwenden

Dies sind die Laufzeit-Jobs, die das Produkt bereits ueber das SDK und die passenden Arbeitsbereich-Tools bereitstellt.

Mobile-First-Laufzeit

Entwickelt fuer App-Open-Attribution, Install-Referrer-Verarbeitung, verzoegerte Deep Links und In-App-Routing.

Betriebliche Transparenz

Verbindet Laufzeit-Tracking mit Analysen, Abstuerzen, Diagnosen und Datenschutz-Hilfsmitteln im gleichen Arbeitsbereich.

Gut fuer Shipping-Teams

Verwenden Sie eine Integrationsflaeche, waehrend der Arbeitsbereich plattformspezifische Diagnosen und Pruefungsschritte uebernimmt.

Integrationshinweise

Halten Sie die oeffentlichen Dokumente schlank, und oeffnen Sie dann den Projektarbeitsbereich, wenn Sie die genauen Setup-Schritte fuer Ihren eigenen Release-Flow benoetigen.

Faehigkeiten

  • Initialisieren Sie eine SDK-Instanz fuer die gesamte App und halten Sie das Navigations-Tracking nah an der Laufzeit.
  • Warten Sie auf den initialen Deep Link, verarbeiten Sie verzoegerte Deep Links und abonnieren Sie Ereignisse, die nach dem Start aufgeloest werden.
  • Untersuchen Sie Install-Referrer-Informationen auf Android, wenn diese verfuegbar sind.
  • Aktivieren Sie DSGVO-bewusste Auslieferung mit gdprEnabled und verwenden Sie attriax.consent.gdpr fuer den DSGVO-Zustand, Pruefungen und Einwilligungsschreiben.
  • Laden Sie Dashboard-verwaltete SKAdNetwork-Regeln beim App-Oeffnen und bewerten Sie lokale Retention-, Kauf-, Umsatz- und Werbeanzeigesignale auf Apple-Plattformen.
  • Verfolgen Sie Seitenaufrufe, benutzerdefinierte Ereignisse, Absturze, Werbe-Callbacks, Umsaetze, Identitaet und mobile Token-Flows durch fokussierte Facades wie attriax.tracking, attriax.deepLinks und attriax.consent.

Hinweise

  • Flutter ist die Referenz-Laufzeit fuer gemeinsames Produktverhalten und damit der direkteste Weg fuer neue mobile Integrationen.
  • Android und iOS sind die staerksten Laufzeitziele. Desktop-Weiterleitung ist moeglich, aber manueller und sollte mit Diagnosen validiert werden.
  • Verwenden Sie den Projektarbeitsbereich, wenn Sie projektspezifische Konfiguration, genaue Host-Werte und plattformspezifischen Setup-Status benoetigen.
  • Hardcoden Sie keine SKAN-Zuordnungen im App-Code. Verwenden Sie die lokale SKAN-Konfiguration nur, wenn ein Build lokale Konvertierungsaktualisierungen deaktivieren soll.

Installation

Verwenden Sie das veroefffentlichbare Flutter-Paket und oeffnen Sie dann den Projektarbeitsbereich fuer detaillierte Diagnosen und Plattformkonfiguration.

Installationsbefehl

flutter pub add attriax_flutter

Beispiel

Das folgende Snippet spiegelt den Startpunkt des Projektarbeitsbereichs wider und haelt den Leitfaden allgemein statt projektspezifisch.

lib/main.dart

Einmalig initialisieren, auf das SDK warten, Deep Links abonnieren und aufgeloeste Pfade in Ihren Flutter-Navigations-Stack leiten.

1import 'dart:async';
2import 'package:flutter/material.dart';
3import 'package:attriax_flutter/attriax.dart';
4
5// Create one SDK instance for the whole application.
6final Attriax attriax = Attriax(
7  config: const AttriaxConfig(
8    projectToken: 'ax_your_project_token',
9    gdprEnabled: true,
10  ),
11);
12
13final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
14
15Future<void> main() async {
16  WidgetsFlutterBinding.ensureInitialized();
17
18  // Wait for the SDK before the UI starts.
19  await attriax.init();
20
21  // Use the GDPR helper from your privacy UI or settings screen when needed.
22  // final needsConsent = await attriax.consent.gdpr.needsConsent(localOnly: true);
23
24  runApp(const MyApp());
25}
26
27class MyApp extends StatelessWidget {
28  const MyApp({super.key});
29
30  
31  Widget build(BuildContext context) {
32    return MaterialApp(
33      navigatorKey: navigatorKey,
34      navigatorObservers: <NavigatorObserver>[
35        // This tracks page changes for normal Flutter navigation.
36        AttriaxNavigationObserver(attriax: attriax),
37      ],
38      routes: <String, WidgetBuilder>{
39        '/': (_) => const HomeScreen(),
40        '/promo': (_) => const PromoScreen(),
41        '/deep-link': (_) => const DeepLinkScreen(),
42      },
43    );
44  }
45}
46
47class HomeScreen extends StatefulWidget {
48  const HomeScreen({super.key});
49
50  
51  State<HomeScreen> createState() => _HomeScreenState();
52}
53
54class _HomeScreenState extends State<HomeScreen> {
55  StreamSubscription<AttriaxDeepLinkEvent>? _deepLinkSubscription;
56
57  
58  void initState() {
59    super.initState();
60
61    // Listen for deep links that resolve after startup.
62    _deepLinkSubscription = attriax.deepLinks.stream.listen(_handleDeepLinkEvent);
63
64    // Load startup attribution without blocking the first frame.
65    unawaited(_loadStartupAttribution());
66  }
67
68  
69  void dispose() {
70    unawaited(_deepLinkSubscription?.cancel() ?? Future<void>.value());
71    super.dispose();
72  }
73
74  Future<void> _loadStartupAttribution() async {
75    final initialDeepLinkEvent = await attriax.deepLinks.waitForInitialDeepLink();
76    final originalInstallReferrer = await attriax.referrer
77        .getOriginalInstallReferrer();
78    final reinstallReferrer = await attriax.referrer
79        .getReinstallReferrer();
80
81    if (!mounted) {
82      return;
83    }
84
85    if (originalInstallReferrer != null) {
86      debugPrint(
87        'Original install referrer: ${originalInstallReferrer.campaign}',
88      );
89    }
90
91    if (reinstallReferrer != null) {
92      debugPrint('Reinstall referrer: ${reinstallReferrer.campaign}');
93    }
94
95    if (initialDeepLinkEvent?.found == true) {
96      _openDeepLink(initialDeepLinkEvent!);
97    }
98  }
99
100  void _handleDeepLinkEvent(AttriaxDeepLinkEvent event) {
101    if (!mounted || !event.found) {
102      return;
103    }
104
105    _openDeepLink(event);
106  }
107
108  void _openDeepLink(AttriaxDeepLinkEvent event) {
109    final attriaxPath = event.uri.path.replaceFirst(RegExp(r'^/+'), '');
110    final routeName = attriaxPath.startsWith('promo/')
111        ? '/promo'
112        : '/deep-link';
113
114    navigatorKey.currentState?.pushNamed(routeName, arguments: event);
115  }
116
117  
118  Widget build(BuildContext context) {
119    return const Scaffold(body: Center(child: Text('Attriax ready')));
120  }
121}
122
123class PromoScreen extends StatelessWidget {
124  const PromoScreen({super.key});
125
126  
127  Widget build(BuildContext context) {
128    return const Scaffold(body: Center(child: Text('Promo screen')));
129  }
130}
131class DeepLinkScreen extends StatelessWidget {
132  const DeepLinkScreen({super.key});
133
134  
135  Widget build(BuildContext context) {
136    return const Scaffold(body: Center(child: Text('Deep link screen')));
137  }
138}