url_flow_sdk_poc 1.2.0 copy "url_flow_sdk_poc: ^1.2.0" to clipboard
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,
      ),
    );
  }
}
0
likes
150
points
10
downloads

Documentation

API reference

Publisher

unverified uploader

Weekly Downloads

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 payment flows, OAuth, and promotional pages.

Repository (GitHub)
View/report issues

Topics

#webview #sdk #security #payments #redirect

License

MIT (license)

Dependencies

flutter, flutter_jailbreak_detection, webview_flutter

More

Packages that depend on url_flow_sdk_poc