url_flow_sdk_poc 1.2.0
url_flow_sdk_poc: ^1.2.0 copied to clipboard
A reusable Flutter SDK for timed URL redirects with auto-close functionality. Features include jailbreak/root detection, URL domain validation, custom theming, and lifecycle callbacks. Perfect for pa [...]
example/lib/main.dart
import 'package:flutter/material.dart';
import 'package:url_flow_sdk_poc/url_flow_sdk_poc.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'WebFlow SDK Example',
debugShowCheckedModeBanner: false,
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
useMaterial3: true,
),
home: const ExamplePage(),
);
}
}
class ExamplePage extends StatefulWidget {
const ExamplePage({super.key});
@override
State<ExamplePage> createState() => _ExamplePageState();
}
class _ExamplePageState extends State<ExamplePage> {
WebFlowResult? _lastResult;
/// Basic example with default settings
Future<void> _basicExample() async {
final result = await webFlow.quickStart(
context: context,
initialUrl: 'https://flutter.dev',
redirectUrl: 'https://pub.flutter-io.cn',
title: 'Basic Example',
);
setState(() => _lastResult = result);
_showResult(result);
}
/// Example with custom delays
Future<void> _customDelaysExample() async {
final result = await webFlow.startSession(
context: context,
config: const WebFlowConfig(
initialUrl: 'https://google.com',
redirectUrl: 'https://github.com',
initialDelay: Duration(seconds: 3),
redirectDelay: Duration(seconds: 2),
title: 'Custom Delays',
showNavigationControls: true,
),
);
setState(() => _lastResult = result);
_showResult(result);
}
/// Example with custom theme
Future<void> _customThemeExample() async {
final result = await webFlow.startSession(
context: context,
config: WebFlowConfig(
initialUrl: 'https://dart.dev',
redirectUrl: 'https://docs.flutter.dev',
initialDelay: const Duration(seconds: 4),
redirectDelay: const Duration(seconds: 3),
title: 'Custom Theme',
theme: WebFlowTheme.primary(Colors.purple),
),
);
setState(() => _lastResult = result);
_showResult(result);
}
/// Example with callbacks
Future<void> _callbacksExample() async {
final result = await webFlow.startSession(
context: context,
config: WebFlowConfig(
initialUrl: 'https://flutter.dev',
redirectUrl: 'https://pub.flutter-io.cn',
initialDelay: const Duration(seconds: 5),
redirectDelay: const Duration(seconds: 3),
title: 'With Callbacks',
onInitialPageLoaded: (url) {
debugPrint('β
Initial page loaded: $url');
},
onRedirect: (from, to) {
debugPrint('π Redirecting from $from to $to');
},
onSessionClosing: (duration) {
debugPrint('π Session closing after ${duration.inSeconds}s');
},
onProgressUpdate: (step, total, elapsed) {
debugPrint('π Step $step/$total - Elapsed: ${elapsed.inSeconds}s');
},
),
);
setState(() => _lastResult = result);
_showResult(result);
}
/// Example with dark theme
Future<void> _darkThemeExample() async {
final result = await webFlow.startSession(
context: context,
config: WebFlowConfig(
initialUrl: 'https://github.com',
redirectUrl: 'https://stackoverflow.com',
initialDelay: const Duration(seconds: 4),
redirectDelay: const Duration(seconds: 3),
title: 'Dark Theme',
theme: WebFlowTheme.dark(),
),
);
setState(() => _lastResult = result);
_showResult(result);
}
void _showResult(WebFlowResult result) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
result.isSuccess
? 'β
Success! Duration: ${result.sessionDuration?.inSeconds}s'
: result.isCancelled
? 'β Cancelled'
: 'β οΈ Error: ${result.errorMessage}',
),
backgroundColor: result.isSuccess
? Colors.green
: result.isCancelled
? Colors.orange
: Colors.red,
),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('WebFlow SDK Examples'),
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
),
body: ListView(
padding: const EdgeInsets.all(16),
children: [
// Last result card
if (_lastResult != null)
Card(
color: _lastResult!.isSuccess
? Colors.green.shade50
: Colors.orange.shade50,
child: Padding(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Last Result: ${_lastResult!.status.name.toUpperCase()}',
style: const TextStyle(fontWeight: FontWeight.bold),
),
if (_lastResult!.sessionDuration != null)
Text('Duration: ${_lastResult!.sessionDuration!.inSeconds}s'),
if (_lastResult!.lastUrl != null)
Text(
'Last URL: ${_lastResult!.lastUrl}',
style: const TextStyle(fontSize: 12),
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
],
),
),
),
const SizedBox(height: 16),
// Example buttons
_buildExampleButton(
title: 'Basic Example',
subtitle: 'Default settings with quick start',
icon: Icons.play_arrow,
color: Colors.blue,
onPressed: _basicExample,
),
_buildExampleButton(
title: 'Custom Delays',
subtitle: '3s initial, 2s redirect, with nav controls',
icon: Icons.timer,
color: Colors.green,
onPressed: _customDelaysExample,
),
_buildExampleButton(
title: 'Custom Theme (Purple)',
subtitle: 'WebFlowTheme.primary(Colors.purple)',
icon: Icons.palette,
color: Colors.purple,
onPressed: _customThemeExample,
),
_buildExampleButton(
title: 'With Callbacks',
subtitle: 'Logs events to debug console',
icon: Icons.notifications,
color: Colors.orange,
onPressed: _callbacksExample,
),
_buildExampleButton(
title: 'Dark Theme',
subtitle: 'WebFlowTheme.dark()',
icon: Icons.dark_mode,
color: Colors.grey.shade800,
onPressed: _darkThemeExample,
),
],
),
);
}
Widget _buildExampleButton({
required String title,
required String subtitle,
required IconData icon,
required Color color,
required VoidCallback onPressed,
}) {
return Card(
margin: const EdgeInsets.only(bottom: 12),
child: ListTile(
leading: CircleAvatar(
backgroundColor: color,
child: Icon(icon, color: Colors.white),
),
title: Text(title),
subtitle: Text(subtitle, style: const TextStyle(fontSize: 12)),
trailing: const Icon(Icons.chevron_right),
onTap: onPressed,
),
);
}
}