form_autosave_kit library

A Flutter package for automatic form field persistence and restoration.

This package provides widgets and utilities to automatically save form field values to storage and restore them on app restart.

Basic Usage

import 'package:flutter/material.dart';
import 'package:form_autosave_kit/form_autosave_kit.dart';

class MyForm extends StatefulWidget {
  @override
  _MyFormState createState() => _MyFormState();
}

class _MyFormState extends State<MyForm> {
  final _emailCtrl = TextEditingController();

  @override
  Widget build(BuildContext context) {
    return AutosaveForm(
      formId: 'onboarding_email',
      onRestored: (data) {
        _emailCtrl.text = data['email'] ?? '';
      },
      child: AutosaveField(
        fieldId: 'email',
        controller: _emailCtrl,
        child: TextFormField(
          controller: _emailCtrl,
          decoration: const InputDecoration(labelText: 'Email'),
        ),
      ),
    );
  }
}

With Draft Banner

class CheckoutScreen extends StatefulWidget {
  @override
  State<CheckoutScreen> createState() => _CheckoutScreenState();
}

class _CheckoutScreenState extends State<CheckoutScreen> {
  final _formKey = GlobalKey<FormState>();
  final _nameCtrl = TextEditingController();
  final _emailCtrl = TextEditingController();

  void _onRestored(Map<String, dynamic> data) {
    _nameCtrl.text = data['name'] ?? '';
    _emailCtrl.text = data['email'] ?? '';
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        children: [
          AutosaveDraftBanner(
            formId: 'checkout_form',
            onRestore: _onRestored,
          ),
          Expanded(
            child: AutosaveForm(
              formId: 'checkout_form',
              child: Form(
                key: _formKey,
                child: ListView(
                  padding: const EdgeInsets.all(16.0),
                  children: [
                    AutosaveField(
                      fieldId: 'name',
                      controller: _nameCtrl,
                      child: TextFormField(
                        controller: _nameCtrl,
                        decoration: const InputDecoration(
                          labelText: 'Full Name',
                        ),
                      ),
                    ),
                    const SizedBox(height: 16),
                    AutosaveField(
                      fieldId: 'email',
                      controller: _emailCtrl,
                      child: TextFormField(
                        controller: _emailCtrl,
                        decoration:
                            const InputDecoration(labelText: 'Email'),
                      ),
                    ),
                    const SizedBox(height: 32),
                    ElevatedButton(
                      onPressed: () async {
                        await AutosaveController(
                          formId: 'checkout_form',
                        ).clear();
                      },
                      child: const Text('Submit'),
                    ),
                  ],
                ),
              ),
            ),
          ),
        ],
      ),
    );
  }
}

With Controller API

class SurveyScreen extends StatefulWidget {
  @override
  State<SurveyScreen> createState() => _SurveyScreenState();
}

class _SurveyScreenState extends State<SurveyScreen> {
  final _nameCtrl = TextEditingController();
  final _controller = AutosaveController(formId: 'survey_form');

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addPostFrameCallback((_) async {
      final data = await _controller.restore();
      if (data.isNotEmpty && mounted) {
        _nameCtrl.text = data['name'] ?? '';
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: AutosaveForm(
        formId: 'survey_form',
        child: ListView(
          padding: const EdgeInsets.all(16.0),
          children: [
            AutosaveField(
              fieldId: 'name',
              controller: _nameCtrl,
              child: TextFormField(
                controller: _nameCtrl,
                decoration: const InputDecoration(labelText: 'Name'),
              ),
            ),
            const SizedBox(height: 32),
            ElevatedButton(
              onPressed: () async {
                await _controller.clear();
              },
              child: const Text('Submit'),
            ),
          ],
        ),
      ),
    );
  }
}

Classes

AutosaveController
Programmatic API to clear, restore, and query the autosave state.
AutosaveDraftBanner
Optional UI widget that detects a draft on build and shows a banner asking the user to restore or discard changes.
AutosaveField
Wraps a form field widget to automatically report changes to AutosaveForm.
AutosaveForm
The top-level widget that manages auto-saving form fields.
AutosaveFormData
InheritedWidget that provides access to the AutosaveFormState.
AutosaveFormState
State for AutosaveForm.
AutosaveStorage
Abstract interface for autosave storage backends.