import 'dart:async'; import 'package:flutter/material.dart'; import 'package:yx_tracking_flutter/yx_tracking_flutter.dart'; Future main() async { WidgetsFlutterBinding.ensureInitialized(); await Analytics.init( const AnalyticsConfig( systemCode: 'SDK-TEST-FLUTTER', endpointBaseUrl: 'http://192.168.2.7:18828/api/', clientType: 3, enableDebug: true, batchSize: 5, flushInterval: 30, allowInsecureHttp: true, ), ); Analytics.bindLifecycleObserver(); runApp(const DemoApp()); } class DemoApp extends StatelessWidget { const DemoApp({super.key}); @override Widget build(BuildContext context) { return const MaterialApp(home: DemoPage()); } } class DemoPage extends StatefulWidget { const DemoPage({super.key}); @override State createState() => _DemoPageState(); } class _DemoPageState extends State { int _cacheCount = 0; List _recent = const []; bool _flushing = false; bool _refreshingConfig = false; Timer? _pollTimer; @override void initState() { super.initState(); _refreshCount(); _pollTimer = Timer.periodic(const Duration(seconds: 2), (_) { _refreshCount(); }); } @override void dispose() { _pollTimer?.cancel(); super.dispose(); } Future _refreshCount() async { final results = await Future.wait(>[ Analytics.cachedEventCount(), Analytics.cachedRecentEvents(limit: 20), ]); final count = results[0] as int; final recent = results[1] as List; if (!mounted) { return; } setState(() { _cacheCount = count; _recent = recent; }); } Future _trackDemoEvent() async { await Analytics.track( 'DEMO_BUTTON_CLICK', eventParams: const { 'page': 'demo', 'Url': 'https://example.com/demo', 'ButtonId': 'demo_btn_01', }, customTags: const {'tenantId': 't1', 'feature': 'demo'}, ); await _refreshCount(); } Future _flushNow() async { if (_flushing) { return; } setState(() { _flushing = true; }); try { await Analytics.flush(force: true); } finally { if (mounted) { setState(() { _flushing = false; }); } await _refreshCount(); } } Future _refreshConfig() async { if (_refreshingConfig) { return; } setState(() { _refreshingConfig = true; }); try { await Analytics.refreshConfig(force: true); } finally { if (mounted) { setState(() { _refreshingConfig = false; }); } } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('YX Tracking Demo')), body: Padding( padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( '本地缓存事件数:$_cacheCount', style: Theme.of(context).textTheme.titleMedium, ), const SizedBox(height: 16), Wrap( spacing: 12, runSpacing: 12, children: [ ElevatedButton( onPressed: _trackDemoEvent, child: const Text('Track Demo Event'), ), ElevatedButton( onPressed: _flushing ? null : _flushNow, child: Text(_flushing ? 'Flushing...' : 'Flush Now'), ), OutlinedButton( onPressed: _refreshingConfig ? null : _refreshConfig, child: Text( _refreshingConfig ? 'Refreshing...' : 'Refresh Config', ), ), ], ), const SizedBox(height: 12), const Text( '说明:已对接 SDK-TEST-FLUTTER 系统,' '点击 Track 按钮记录事件,点击 Flush 上报。', ), const SizedBox(height: 12), Text( '最近事件(最多 20 条)', style: Theme.of(context).textTheme.titleSmall, ), const SizedBox(height: 8), Expanded( child: _recent.isEmpty ? const Text('暂无事件') : ListView.separated( itemCount: _recent.length, separatorBuilder: (_, __) => const Divider(height: 1), itemBuilder: (context, index) { final item = _recent[index]; return ListTile( dense: true, title: Text(item.eventType), subtitle: Text( '${item.createTime.toIso8601String()} · retry=${item.retryCount}', ), ); }, ), ), ], ), ), ); } }