Creating iOS-Style Forms in Flutter Using CupertinoFormRow

This article guides you through creating an iOS-style form using CupertinoFormRow in Flutter. Cupertino widgets replicate the native iOS design, making your Flutter apps look polished on iOS devices. We’ll explore a step-by-step implementation of a form section with toggles and interactive options using CupertinoFormSection and CupertinoSwitch.


Key Widgets Used

  1. CupertinoFormSection:
    Groups related form rows with headers and separators.
  2. CupertinoFormRow:
    Represents a single form row with a prefix (label) and child widget (control).
  3. CupertinoSwitch:
    An iOS-style toggle switch.
  4. Custom PrefixWidget:
    A reusable widget to create styled prefix icons and titles for form rows.

Code Breakdown

1. Main App Structure

void main() => runApp(const CupertinoFormRowApp());

class CupertinoFormRowApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return const CupertinoApp(
      theme: CupertinoThemeData(brightness: Brightness.light),
      home: CupertinoFormRowExample(),
    );
  }
}

This initializes a simple CupertinoApp with a light theme and a home screen.


2. Creating the Form Section

class CupertinoFormRowExample extends StatefulWidget {
  @override
  State<CupertinoFormRowExample> createState() =>
      _CupertinoFormRowExampleState();
}

class _CupertinoFormRowExampleState extends State<CupertinoFormRowExample> {
  bool airplaneMode = false;

  @override
  Widget build(BuildContext context) {
    return CupertinoPageScaffold(
      navigationBar: const CupertinoNavigationBar(
        middle: Text('CupertinoFormSection Sample'),
      ),
      child: SafeArea(
        child: CupertinoFormSection(
          header: const Text('Connectivity'),
          children: <Widget>[
            CupertinoFormRow(
              prefix: const PrefixWidget(
                icon: CupertinoIcons.airplane,
                title: 'Airplane Mode',
                color: CupertinoColors.systemOrange,
              ),
              child: CupertinoSwitch(
                value: airplaneMode,
                onChanged: (bool value) {
                  setState(() {
                    airplaneMode = value;
                  });
                },
              ),
            ),
            // More rows here
          ],
        ),
      ),
    );
  }
}
  • The form has a navigation bar and a section labeled “Connectivity.”
  • CupertinoSwitch toggles the airplane mode, and its state is updated using setState.

3. Custom Prefix Widget

class PrefixWidget extends StatelessWidget {
  final IconData icon;
  final String title;
  final Color color;

  @override
  Widget build(BuildContext context) {
    return Row(
      children: <Widget>[
        Container(
          padding: const EdgeInsets.all(4.0),
          decoration: BoxDecoration(
            color: color,
            borderRadius: BorderRadius.circular(4.0),
          ),
          child: Icon(icon, color: CupertinoColors.white),
        ),
        const SizedBox(width: 15),
        Text(title)
      ],
    );
  }
}
  • This widget displays an icon with a colored background and title text.
  • It’s used as a prefix for each row in the form.

Result

This example produces an elegant iOS-style form with different connectivity options like Airplane Mode, Wi-Fi, Bluetooth, and Mobile Data. Each row uses Cupertino widgets to maintain a consistent iOS look and feel.