Skip to content

Mobile app development · 5 stages · about 42 weeks

Cross-platform app developer (Flutter) roadmap

A Flutter developer builds one app that runs on both Android and iPhone from the same code. This roadmap takes you from the Dart language to building screens with widgets, managing state, calling servers, saving data, testing and publishing on the Play Store and the App Store.

0/25 tasks done (ticks are kept on this device)

  1. 1

    Beginner · about 5 weeks

    Dart and programming basics

    What to learn

    • Variables and types: Every app stores and works with values.

      Dart has types like int, double, String and bool. Use final for a value set once and const for a value known before the app runs. Choosing final by default makes code safer and easier to read.

    • Conditions, loops and functions: These are the building blocks of every program.

      if/else and switch choose what to do, and for and while loops repeat work. Functions take inputs, do one job and return a result. Arrow functions (=>) are a short form you will see everywhere in Flutter code.

    • Null safety: Null errors are a common cause of crashes.

      Null means "no value". In Dart a type with a question mark, like String?, may be null, and the compiler makes you handle it. Learn ?., ?? and when (rarely) to use !.

    • Classes and objects: Flutter is built entirely from classes.

      A class describes a thing, like a Product with a name and a price. Learn constructors, named parameters (very common in Flutter), and the required keyword. Learn the basics of inheritance, because every widget extends another class.

    • Lists and maps: Most app data is a list of items or key-value pairs.

      A List holds items in order and a Map stores values by key, much like JSON. Practise where, map, fold and sort on lists. You will use these to show, filter and total data on screen.

    • Async, Future and await: Network and file work take time.

      A Future is a value that will arrive later, like the response from a server. async and await let you write this waiting code top to bottom. A Stream gives many values over time, like live chat messages.

    • Git and GitHub: Git saves your work and GitHub shows it to employers.

      Git records your changes as commits so you can go back when something breaks. GitHub stores your projects online. Push every practice project with a short README.

    Tasks

    Project

    A command-line quiz in Dart: questions are stored in a list of maps, the user types answers, and the program shows the score at the end.

    Free resources

  2. 2

    Beginner · about 7 weeks

    Flutter widgets and layouts

    What to learn

    • Setting up Flutter: You need a working setup before anything else.

      Install the Flutter SDK, run flutter doctor and fix what it reports. Run your first app on an emulator and on a real phone. Learn hot reload, which shows code changes in under a second.

    • Widgets: In Flutter, everything on the screen is a widget.

      Text, Image, Icon and ElevatedButton are widgets, and you build screens by putting widgets inside other widgets. This is called the widget tree. Small, well-named widgets make your code easy to read.

    • Stateless and stateful widgets: Some parts of the screen change and some do not.

      A StatelessWidget never changes after it is built, like a title. A StatefulWidget keeps state, like a counter, and calls setState to redraw. Learn this well before moving to bigger state tools.

    • Layouts: Every screen is made of rows, columns and spacing.

      Column stacks widgets top to bottom, Row places them side by side, and Stack layers them. Padding, SizedBox, Expanded and Flexible control space. When you see a yellow and black overflow stripe, the content is too big for its box.

    • Scrolling lists and grids: Most apps show long lists.

      ListView.builder and GridView.builder build only the items that are on screen, so long lists stay smooth. Use a Card or ListTile for each row. Add pull-to-refresh with RefreshIndicator.

    • Material and Cupertino design: Apps should feel natural on Android and iPhone.

      Material widgets follow Google's design system, and Cupertino widgets look like iOS. Set a ThemeData once with your colours and fonts. Support dark mode from the start.

    • Forms and input: Login, search and checkout all need input.

      Use TextField or TextFormField inside a Form, with a validator for each field. Show a clear message when the phone number or email is wrong. Choose the right keyboard type, like number for amounts.

    • Responsive layouts: Phones, tablets and the web have very different sizes.

      MediaQuery and LayoutBuilder tell you how much space you have. Show one column on a phone and two on a tablet. Test on a small 5-inch phone, because many users have one.

    Tasks

    Project

    A menu app for a local restaurant: categories, a grid of dishes with prices in rupees, a dish details screen and a simple order summary, built with Material widgets and a custom theme.

    Free resources

  3. 3

    Intermediate · about 10 weeks

    State, navigation, APIs and local storage

    What to learn

    • State management: Bigger apps need a clear place for shared data.

      When many screens share data, like a cart or the logged-in user, setState is not enough. Provider is simple, Riverpod is a popular modern choice, and Bloc is common in large companies. Learn one well first, and understand the idea behind the others.

    • Navigation and routing: Apps have many screens and deep links.

      Navigator.push opens a new screen and pop goes back. For bigger apps, the go_router package gives named routes and web-style addresses like /product/42. Learn to pass data between screens and return a result.

    • HTTP and REST APIs: Most apps load data from a server.

      The http or dio package sends requests to a REST API. Always show a loading state, an error message and a retry button. Handle no internet and slow networks, which are common on mobile data.

    • JSON and models: Servers send data as JSON.

      jsonDecode turns JSON text into maps, and you then build Dart model classes with fromJson and toJson. For bigger apps, packages like json_serializable or freezed write this code for you. Typed models catch mistakes early.

    • Local storage: Apps should remember data and work offline.

      shared_preferences stores small settings like the theme or language. For real lists of data, use a local database such as sqflite, Drift or Hive. Store tokens in secure storage, not in plain settings.

    • App structure: A clean folder structure keeps the app easy to change.

      Separate UI, state and data: widgets show data, state classes hold logic, and repositories fetch or save data. Many teams organise folders by feature, like auth, cart and profile. Keep widgets free of network code.

    • Packages from pub.dev: Packages save time, but bad ones cause problems.

      pub.dev hosts thousands of Dart and Flutter packages. Check likes, pub points, last update and supported platforms before adding one. Fewer, well-maintained packages are better than many small ones.

    Tasks

    Project

    A news or recipes app that loads data from a public API, caches it for offline reading, lets users save favourites and change theme, using a state management library and go_router.

    Free resources

  4. 4

    Intermediate · about 8 weeks

    Firebase, testing and publishing to the stores

    What to learn

    • Firebase setup with FlutterFire: Firebase gives you login, database and notifications without your own server.

      The FlutterFire CLI connects your Flutter app to a Firebase project for Android and iOS. After setup you add only the Firebase packages you need. Keep separate Firebase projects for testing and for the live app.

    • Authentication and Firestore: Most apps need users and online data.

      Firebase Authentication handles phone OTP, Google and email login. Cloud Firestore stores data as documents and can send live updates. Write security rules so each user can only read and change their own data.

    • Push notifications and Crashlytics: Notifications bring users back and crash reports show what to fix.

      Firebase Cloud Messaging sends notifications to Android and iOS. Ask for permission politely and only when it makes sense. Crashlytics shows real crashes with the line of code, so fix the most common ones first.

    • Unit and widget tests: Tests catch bugs before users do.

      Unit tests check plain Dart logic, like a price calculator. Widget tests build a widget, tap it and check what is shown. Use fake repositories so tests run fast without the internet.

    • Integration tests: Some bugs only show up when the whole app runs together.

      Integration tests run the full app on a device or emulator and go through real flows, like login and checkout. They are slower, so keep them for the most important paths. Run them before every release.

    • Publishing on Google Play: This is how Android users get your app.

      Set the app name, icon and version, then build a signed app bundle with flutter build appbundle. Upload it in Google Play Console, which needs a one-time registration fee. Use internal or closed testing first, and check the current rules for new developer accounts.

    • Publishing on the App Store: This is how iPhone users get your app.

      iOS builds need a Mac with Xcode and a paid Apple Developer Program membership. You upload the build to App Store Connect, test it with TestFlight and send it for review. Read the App Store Review Guidelines before you submit, because rejections are common.

    Tasks

    Project

    A society or hostel notice-board app: residents log in with phone OTP, see notices and events from Firestore, get push notifications, and admins post new notices; with tests, Crashlytics, and an Android testing release.

    Free resources

  5. 5

    Expert · about 12 weeks

    Platform channels, performance and app architecture at scale

    What to learn

    • Platform channels: Some features need native Android or iOS code.

      A platform channel lets Dart code call Kotlin on Android and Swift on iOS, for example to use a special SDK. Data passes as simple messages both ways. Learn enough Kotlin and Swift to write small native pieces, or to build your own plugin.

    • Performance and DevTools: Smooth apps feel professional, especially on low-cost phones.

      Flutter DevTools shows slow frames, memory use and how often widgets rebuild. Use const widgets, avoid rebuilding big parts of the tree and move heavy work off the main isolate. Always test in profile mode on a real, cheap phone.

    • Isolates: Heavy work can freeze the screen.

      An isolate is a separate worker with its own memory, so heavy tasks like parsing a huge JSON file do not block the UI. Isolate.run or compute makes this simple. Use it only when you have measured a real problem.

    • App size and start-up time: Large apps are uninstalled more, especially on phones with little storage.

      Measure app size and remove unused packages and large images. Use app bundles so each phone downloads only what it needs. Show the first screen quickly and load the rest later.

    • Clean, layered architecture: Large apps with big teams need clear rules.

      Split code into presentation, domain and data layers, and keep each feature in its own folder or package. Use dependency injection so parts can be swapped in tests. Write down the rules so new team members follow them.

    • Flavors, CI/CD and releases: Teams ship test and live versions automatically.

      Flavors let you build dev and production versions with different settings and Firebase projects. Run analysis, tests and builds on every pull request with GitHub Actions. Use staged rollouts so a bad release reaches only a few users first.

    • Security and accessibility: Apps handle personal data and must work for everyone.

      Never put secret keys inside the app, use HTTPS, and keep tokens in secure storage. Add semantic labels so screen readers can read your buttons, and support large text sizes. Add Hindi and other languages with Flutter's localisation tools.

    Tasks

    Project

    A complete shop or booking app for Android and iOS: phone login, product catalogue with offline cache, cart in rupees, order history, notifications, two languages, one small platform channel, tests, CI, and releases on Play internal testing and TestFlight.

    Free resources