smartlinks_flutter 2.0.1
smartlinks_flutter: ^2.0.1 copied to clipboard
Unified SmartLinks Flutter SDK for analytics, feedback, apps, ads, community, and blogs.
example/lib/main.dart
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:smartlinks_flutter/smartlinks_flutter.dart';
import 'appearance.dart';
import 'config.dart';
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
final initialized = await SmartLinks.initialize(
apiKey: smartLinksApiKey,
isDebug: true,
initializeAds: true,
appearance: smartLinksExampleAppearance,
);
if (initialized) {
await SmartLinks.analytics.getLink((route) {
debugPrint('[SmartLinks Example] Deep link: ${route.route}');
debugPrint('[SmartLinks Example] Params: ${route.parameters}');
});
}
runApp(SmartLinksExampleApp(initialized: initialized));
}
class SmartLinksExampleApp extends StatelessWidget {
const SmartLinksExampleApp({super.key, required this.initialized});
final bool initialized;
@override
Widget build(BuildContext context) {
return GetMaterialApp(
title: 'SmartLinks SDK',
theme: ThemeData(colorSchemeSeed: Colors.deepPurple, useMaterial3: true),
home: HomePage(initialized: initialized),
);
}
}
class HomePage extends StatefulWidget {
const HomePage({super.key, required this.initialized});
final bool initialized;
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
String? _appUserId;
String? _lastEvent;
bool _promoActive = false;
DateTime? _promoExpires;
@override
void initState() {
super.initState();
_loadIdentity();
_loadPromoStatus();
}
Future<void> _loadIdentity() async {
if (!widget.initialized) {
return;
}
final id = await SmartLinks.analytics.getAppUserId();
if (mounted) {
setState(() => _appUserId = id);
}
}
Future<void> _loadPromoStatus() async {
if (!widget.initialized) return;
final active = await SmartLinks.isPromoActive();
final expires = active ? await SmartLinks.getPromoExpiration() : null;
if (mounted) {
setState(() {
_promoActive = active;
_promoExpires = expires;
});
}
}
Future<void> _logAppOpen() async {
await SmartLinks.analytics.sendEvent('app_open', {
'source': 'smartlinks_example',
});
if (mounted) {
setState(() => _lastEvent = 'app_open');
}
}
Future<void> _openPromoDialog() async {
final redeemed = await SmartLinks.showPromoDialog(context);
if (redeemed == true) {
await _loadPromoStatus();
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('SmartLinks Unified SDK')),
body: ListView(
padding: const EdgeInsets.all(16),
children: [
Card(
child: Padding(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
widget.initialized
? 'SDK ready'
: 'SDK failed to initialize',
style: Theme.of(context).textTheme.titleMedium?.copyWith(
color: widget.initialized ? Colors.green : Colors.red,
),
),
const SizedBox(height: 8),
Text('App user id: ${_appUserId ?? '—'}'),
if (_lastEvent != null) Text('Last event: $_lastEvent'),
const SizedBox(height: 8),
Text(
_promoActive
? 'Promo active until: ${_promoExpires ?? '—'}'
: 'Promo: not active',
),
],
),
),
),
const SizedBox(height: 8),
ListTile(
leading: const Icon(Icons.analytics),
title: const Text('Log app_open'),
onTap: widget.initialized ? _logAppOpen : null,
),
ListTile(
leading: const Icon(Icons.card_giftcard),
title: const Text('Redeem Promo (dialog)'),
onTap: widget.initialized ? _openPromoDialog : null,
),
ListTile(
leading: const Icon(Icons.redeem),
title: const Text('Redeem Promo (full page)'),
onTap: widget.initialized
? () async {
await SmartLinks.openPromoEntry(context);
await _loadPromoStatus();
}
: null,
),
ListTile(
leading: const Icon(Icons.smart_toy),
title: const Text('AI Test'),
onTap: widget.initialized
? () => SmartLinks.openAiTest(context)
: null,
),
ListTile(
leading: const Icon(Icons.feedback),
title: const Text('Open Feedback'),
onTap: widget.initialized
? () async {
final isPremium = await SmartLinks.isPromoActive();
if (!context.mounted) return;
await SmartLinks.openFeedback(
isPremium: isPremium,
customNavigation: (page) => Navigator.push(
context,
MaterialPageRoute(builder: (_) => page),
),
);
}
: null,
),
ListTile(
leading: const Icon(Icons.apps),
title: const Text('Open Our Apps'),
onTap: widget.initialized
? () => SmartLinks.openApps(
customNavigation: (page) => Navigator.push(
context,
MaterialPageRoute(builder: (_) => page),
),
)
: null,
),
ListTile(
leading: const Icon(Icons.forum),
title: const Text('Open Community'),
onTap: widget.initialized ? () => SmartLinksCommunity.open() : null,
),
ListTile(
leading: const Icon(Icons.article),
title: const Text('Open Blogs'),
onTap: widget.initialized ? () => SmartLinksBlogs.open() : null,
),
const SizedBox(height: 12),
if (widget.initialized) SmartLinkBannerAd(adService: SmartLinks.ads),
],
),
);
}
}