0
0
Fluttermobile~20 mins

App Store submission in Flutter - Mini App: Build & Ship

Choose your learning style9 modes available
Build: App Submission Checklist
This screen helps developers prepare their Flutter app for App Store submission by showing a checklist of required steps and information.
Target UI
----------------------------------
| App Submission Checklist       |
|--------------------------------|
| [ ] App Name                   |
| [ ] App Icon                   |
| [ ] Screenshots                |
| [ ] Privacy Policy URL         |
| [ ] Version Number             |
| [ ] Build Number               |
| [ ] Release Notes              |
|                                |
|       [Submit to App Store]    |
----------------------------------
Display a checklist with 6 items: App Name, App Icon, Screenshots, Privacy Policy URL, Version Number, Build Number
Each item should have a checkbox that can be toggled on/off
Below the checklist, show a multiline TextField for Release Notes input
Add a Submit button that is disabled until all checklist items are checked and Release Notes is not empty
When Submit is tapped, show a dialog confirming submission
Starter Code
Flutter
import 'package:flutter/material.dart';

class AppSubmissionChecklist extends StatefulWidget {
  @override
  State<AppSubmissionChecklist> createState() => _AppSubmissionChecklistState();
}

class _AppSubmissionChecklistState extends State<AppSubmissionChecklist> {
  // TODO: Add checklist state variables
  // TODO: Add TextEditingController for Release Notes

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('App Submission Checklist')),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            // TODO: Add checklist items with checkboxes
            // TODO: Add Release Notes TextField
            // TODO: Add Submit button
          ],
        ),
      ),
    );
  }
}
Task 1
Task 2
Task 3
Task 4
Task 5
Task 6
Solution
Flutter
import 'package:flutter/material.dart';

class AppSubmissionChecklist extends StatefulWidget {
  @override
  State<AppSubmissionChecklist> createState() => _AppSubmissionChecklistState();
}

class _AppSubmissionChecklistState extends State<AppSubmissionChecklist> {
  bool appNameChecked = false;
  bool appIconChecked = false;
  bool screenshotsChecked = false;
  bool privacyPolicyChecked = false;
  bool versionNumberChecked = false;
  bool buildNumberChecked = false;

  final TextEditingController releaseNotesController = TextEditingController();

  bool get isSubmitEnabled {
    return appNameChecked && appIconChecked && screenshotsChecked && privacyPolicyChecked && versionNumberChecked && buildNumberChecked && releaseNotesController.text.trim().isNotEmpty;
  }

  @override
  void initState() {
    super.initState();
    releaseNotesController.addListener(() {
      setState(() {});
    });
  }

  @override
  void dispose() {
    releaseNotesController.dispose();
    super.dispose();
  }

  void _showSubmissionDialog() {
    showDialog(
      context: context,
      builder: (context) => AlertDialog(
        title: Text('Confirm Submission'),
        content: Text('Are you sure you want to submit your app to the App Store?'),
        actions: [
          TextButton(
            onPressed: () => Navigator.of(context).pop(),
            child: Text('Cancel'),
          ),
          ElevatedButton(
            onPressed: () {
              Navigator.of(context).pop();
              ScaffoldMessenger.of(context).showSnackBar(
                SnackBar(content: Text('App submitted successfully!')),
              );
            },
            child: Text('Submit'),
          ),
        ],
      ),
    );
  }

  Widget _buildCheckbox(String title, bool value, void Function(bool?) onChanged) {
    return CheckboxListTile(
      title: Text(title),
      value: value,
      onChanged: onChanged,
      controlAffinity: ListTileControlAffinity.leading,
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('App Submission Checklist')),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Expanded(
              child: ListView(
                children: [
                  _buildCheckbox('App Name', appNameChecked, (val) => setState(() => appNameChecked = val ?? false)),
                  _buildCheckbox('App Icon', appIconChecked, (val) => setState(() => appIconChecked = val ?? false)),
                  _buildCheckbox('Screenshots', screenshotsChecked, (val) => setState(() => screenshotsChecked = val ?? false)),
                  _buildCheckbox('Privacy Policy URL', privacyPolicyChecked, (val) => setState(() => privacyPolicyChecked = val ?? false)),
                  _buildCheckbox('Version Number', versionNumberChecked, (val) => setState(() => versionNumberChecked = val ?? false)),
                  _buildCheckbox('Build Number', buildNumberChecked, (val) => setState(() => buildNumberChecked = val ?? false)),
                  SizedBox(height: 16),
                  Text('Release Notes', style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16)),
                  SizedBox(height: 8),
                  TextField(
                    controller: releaseNotesController,
                    maxLines: 4,
                    decoration: InputDecoration(
                      border: OutlineInputBorder(),
                      hintText: 'Enter release notes here',
                    ),
                  ),
                ],
              ),
            ),
            SizedBox(height: 16),
            SizedBox(
              width: double.infinity,
              child: ElevatedButton(
                onPressed: isSubmitEnabled ? _showSubmissionDialog : null,
                child: Text('Submit to App Store'),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

This screen uses a stateful widget to track the checklist items as boolean variables. Each checklist item is shown as a CheckboxListTile so the user can tap to check or uncheck it.

A TextEditingController manages the Release Notes input. The submit button is enabled only when all checklist items are checked and the Release Notes field is not empty.

When the user taps Submit, a confirmation dialog appears. If confirmed, a success message shows using a SnackBar.

This approach keeps the UI simple and accessible, with clear labels and a logical flow for preparing an app for App Store submission.

Final Result
Completed Screen
----------------------------------
| App Submission Checklist       |
|--------------------------------|
| [x] App Name                   |
| [x] App Icon                   |
| [x] Screenshots                |
| [x] Privacy Policy URL         |
| [x] Version Number             |
| [x] Build Number               |
|                                |
| Release Notes                  |
| ----------------------------- |
| | Fixed bugs and improved UI | |
| | Added new features         | |
| ----------------------------- |
|                                |
|       [Submit to App Store]    |
----------------------------------
User taps checkboxes to mark each checklist item as done
User types release notes in the multiline text field
Submit button becomes enabled only when all checklist items are checked and release notes are not empty
Tapping Submit shows a confirmation dialog
Confirming submission shows a success message
Stretch Goal
Add a toggle switch to enable dark mode for the checklist screen.
💡 Hint
Use a Switch widget in the AppBar or at the top of the screen to toggle a boolean state that changes the ThemeData brightness between light and dark.