Flutter SDK
Die Flutter SDK is die primere Attriax-looptyd-implementering en die beste plek om te begin wanneer u eersteklas mobiele attribusie, diep skakels en lewensiklusopsporing wil he.
Pakketoppervlak
Algemene gids vir attriax_flutter. Gebruik die projekwerkspasie wanneer u gedetailleerde opstelstappe, vrystelling-konteks en projekspesifieke waardes benodig.
Waarvoor spanne dit gebruik
Dit is die looptyd-take wat die produk reeds deur die SDK en die ooreenstemmende werkspasie-gereedskap beskikbaar stel.
Mobiel-eerste looptyd
Gebou vir app-oop-attribusie, installasie-verwyserhanteer, uitgestelde diep skakels en binne-app-roeteer.
Bedryfssigbaarheid
Koppel looptyd-opsporing met ontledings, ineenstortings, diagnostiek en privaatheidshelpers in dieselfde werkruimte.
Goed vir versendingspanne
Gebruik een integrasieoppervlak terwyl die werkruimte platformspesifieke diagnostiek en hersieningstappe hanteer.
Integrasienotas
Hou die openbare dokumentasie liggies, en open dan die projekwerkspasie wanneer u die presiese opstelstappe vir u eie vrystellingsvloei benodig.
Vermoens
- Initialiseer een SDK-instansie vir die hele app en hou navigasie-opsporing naby aan die looptyd.
- Wag vir die aanvanklike diep skakel, hanteer uitgestelde diep skakels en teken in op gebeurtenisse wat na opstart opgelos word.
- Ondersoek installasie-verwyseriginligting op Android wanneer dit beskikbaar is.
- Aktiveer GDPR-bewuste aflewering met gdprEnabled en gebruik attriax.consent.gdpr vir GDPR-toestand, kontroles en toestemmingsskrywes.
- Laai dasjieboord-bestuurde SKAdNetwork-reels tydens app-opening en evalueer plaaslike retensie-, aankoop-, inkomste- en advertensie-wys-seine op Apple-platforms.
- Spoor bladsyaansigte, gepasmaakte gebeurtenisse, ineenstortings, advertensie-terugvrae, inkomste, identiteit en mobiele token-vloei deur gefokusde fasades soos attriax.tracking, attriax.deepLinks en attriax.consent.
Notas
- Flutter is die verwysing-looptyd vir gedeelde produkgedrag, dus is dit die mees direkte pad vir nuwe mobiele integrasies.
- Android en iOS is die sterkste looptyddoelwitte. Werkskermdeurstuur bestaan, maar dit is meer handmatig en moet met diagnostiek bevestig word.
- Gebruik die projekwerkruimte wanneer u projekspesifieke konfigurasie, presiese gasheerswaardes en platformspesifieke opstelstatus benodig.
- Moenie SKAN-karteerings in appkode hardkodeer nie. Gebruik plaaslike SKAN-konfig slegs wanneer 'n bouwerk plaaslike omsettings-opdaterings moet deaktiveer.
Installeer
Gebruik die publiseerbare Flutter-pakket en maak dan die projekwerkruimte oop vir gedetailleerde diagnostiek en platformkonfigurasie.
Installeer-opdrag
flutter pub add attriax_flutterVoorbeeld
Die onderstaande kode-uittreksel weerspieel die beginpunt van die projekwerkspasie terwyl die gids algemeen bly in plaas van projekspesifiek.
lib/main.dart
Initialiseer een keer, wag vir die SDK, teken in op diep skakels en lei opgeboste paaie na u Flutter-navigasiestapel.
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}