liquid_analytics_ui 0.2.0
liquid_analytics_ui: ^0.2.0 copied to clipboard
DX widgets for liquid_analytics — consent banner kit and in-app event inspector.
// DX widgets for liquid_analytics: a consent banner and an in-app event
// inspector. (GoRouter screen tracking lives in `liquid_go_router`.)
import 'package:flutter/material.dart';
import 'package:liquid_analytics/liquid_analytics.dart';
import 'package:liquid_analytics_ui/liquid_analytics_ui.dart';
/// RecordingSink feeds the inspector (and the DevTools timeline in debug).
final RecordingSink recording = RecordingSink();
late final Liquid liquid;
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
liquid = Liquid(
sinks: [recording, DebugSink()],
consent: const ConsentPolicy(
requireOptIn: true,
map: {
ConsentCategory.analytics: ['recording', 'debug'],
},
),
);
await liquid.init();
runApp(const ExampleApp());
}
class ExampleApp extends StatelessWidget {
const ExampleApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
// Automatic screen tracking. For GoRouter apps, use
// LiquidGoRouterObserver from the liquid_go_router package.
navigatorObservers: [LiquidNavigatorObserver(liquid)],
home: Scaffold(
appBar: AppBar(title: const Text('liquid_analytics_ui')),
body: Stack(
children: [
Center(
child: ElevatedButton(
onPressed: () => liquid.track('button_tapped', {'id': 'buy'}),
child: const Text('Track an event'),
),
),
// Floating panel listing recent messages, live.
LiquidInspector(controller: recording.controller),
// Hides itself once every listed category has a decision.
Align(
alignment: Alignment.bottomCenter,
child: LiquidConsentBanner(
controller: liquid.consent,
onAccept: () => liquid.consent.grant(ConsentCategory.analytics),
onReject: () => liquid.consent.deny(ConsentCategory.analytics),
),
),
],
),
),
);
}
}