Full Flutter App Sample

A fully operational widget tree for virtual try-on using the low-level client API.

example.dart
import 'package:flutter/material.dart';
import 'package:snapit_sdk/snapit_sdk.dart';

class VtonScreen extends StatefulWidget {
  const VtonScreen({Key? key}) : super(key: key);

  @override
  State<VtonScreen> createState() => _VtonScreenState();
}

class _VtonScreenState extends State<VtonScreen> {
  String? _outputUrl;
  bool _isLoading = false;
  
  late final SnapITClient _client;

  @override
  void initState() {
    super.initState();
    _client = SnapITClient(
      apiKey: "smd_live_your_key_here",
      userId: "user_abc123",
    );
  }

  void _runGeneration() async {
    setState(() => _isLoading = true);
    try {
      final resultUrl = await _client.generateTryOn(
        garmentImageUrl: "https://apisdk.snapmydesign.com/sample/tshirt.png",
        personImageUrl: "https://apisdk.snapmydesign.com/sample/model.png",
        modelName: "medium",
      );
      setState(() => _outputUrl = resultUrl);
    } catch (e) {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text("Try-On failed: $e")),
      );
    } finally {
      setState(() => _isLoading = false);
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("SnapIt VTON")),
      body: Center(
        child: _isLoading 
          ? const CircularProgressIndicator()
          : _outputUrl != null 
            ? Image.network(
                _outputUrl!,
                fit: BoxFit.contain,
              )
            : ElevatedButton(
                onPressed: _runGeneration,
                child: const Text("Generate Try-On"),
              ),
      ),
    );
  }
}