• Stars
    star
    149
  • Rank 248,619 (Top 5 %)
  • Language
    Dart
  • License
    MIT License
  • Created over 4 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A Flutter template application showcasing - Clean architecture, Responsive design, State management, Decoupled widgets using the connector pattern, Dependency Injection, Widget and Unit testing, Navigation, Localization, Material 3 dynamic theming, Continuous Integration and Continuous Deployment.

Flutter Template

A Flutter template application showcasing - Clean architecture, Responsive design, State management, Decoupled widgets using the connector pattern, Dependency Injection, Widget and Unit testing, Navigation, Localization, Material 3 dynamic theming, Continuous Integration and Continuous Deployment.


Expert teams of digital product strategists, developers, and designers.


We’re always looking for people who value their work, so come and join us. We are hiring!

CI

Getting Started

Clone the repo and follow these steps to setup the project.

Environment

The template was build using dart null safety. Dart 2.19.2 or greater and Flutter 3 or greater is required.

Follow this guide to setup your flutter environment based on your platform.

Flutter

First and foremost make sure you have Flutter 3 setup on your system. You can check the version by running

flutter --version

You should see output similar to this. Check if the version is 3.x.x.

Flutter 3.7.7 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 2ad6cd72c0 (13 days ago) • 2023-03-08 09:41:59 -0800
Engine • revision 1837b5be5f
Tools • Dart 2.19.4 • DevTools 2.20.1

If not run this command to update flutter to the latest version

flutter upgrade

Derry

This template uses derry as it's script manager. Run this command to setup derry

dart pub global activate derry

Most of the scripts we will use are abstracted away by derry. If you want to know more about the scirpts, read the scripts documentation.

Get Dependencies

flutter pub get

Run Code Generation

derry generate all

API Key

You can skip this step if you just want to get the template running. If you skip this step, the weather search will not give you any results.

Sensitive information like api keys, credentials, etc should not be checked into git repos, especially public ones. To keep such data safe the template uses .env files. Each Flavor uses it's own .env file.

The tempalte uses weather api from openweathermap.org. You can get your Open Weather API key from here.

Once you have the key, update the .env files with your api key. Replace YOUR_API_KEY with the key that you got from open weather api.

OPEN_WEATHER_API_KEY=YOUR_API_KEY  
OPEN_WEATHER_BASE_URL=https://api.openweathermap.org/

Running the app

With the setup done, we can get the app running.

Flavors

The template comes with built-in support for 3 flavors. Each flavor has it's own .env file.

You can setup any environment specific values in the respective .env files.

Launch

To launch the app run the following command and specify the flavor name.

 derry launch dev

Android Studio

On android studio, you will find pre defined run configurations.

  • Select a flavor from the dropdown

Screenshot 2023-03-21 at 11 24 35 AM

  • Select a device to launch on

Screenshot 2023-03-21 at 11 24 25 AM

  • Click Run to launch the app

Screenshot 2023-03-21 at 11 24 45 AM

Architecture

The architecture of the template facilitates separation of concerns and avoids tight coupling between it's various layers. The goal is to have the ability to make changes to individual layers without affecting the entire app. This architecture is an adaptation of concepts from The Clean Architecture.

Layers

The architecture is separated into the following layers

  • lib/presentation: All UI and state management elements like widgets, pages and view models.
  • lib/navigation: navigators to navigate between destinations.
  • lib/interactor: provides feature specific functionality.
  • lib/domain: use cases for individual pieces of work.
  • lib/repository: repositories to manage various data sources.
  • lib/services: services provide access to external elements such as databases, apis, etc.

Each layer has a di directory to manage Dependency Injection for that layer.

Entities

The layers presentation, domain and services each have an entity directory.

  • lib/presentation/entity: Classes that model the visual elements used by the widgets.
  • lib/domain/entity: Model classes for performing business logic manipulations. They act as an abstraction to hide the local and remote data models.
  • lib/services/entity: Contains local models (data classes for the database) and remote models (data classes for the api).

Entity Naming Convention

  • Presentation entities are prefixed with UI (eg: UICity).
  • Domain entities do not have any prefix. (eg: City).
  • Service entities are of 2 types:
    • Local / Database entities are prefixed with Local (eg: LocalCity).
    • Remote / API entities are prefixed with Remote (eg: RemoteCity).

Other Directories

Apart from the main layers, the template has

Understanding the Presentation Layer

The presentation layer houses all the visual components and state management logic.

The base directory has all the reusable and common elements used as building blocks for the UI like common widgets, app theme data, exceptions, base view models etc.

View Model

State Management is done using the riverpod along with state_notifier. The class that manages state is called the View Model.

Each View Model is a subclass of the BaseViewModel. The BaseViewModel is a StateNotifier of ScreenState. Along with the ScreenState it also exposes a stream of Effect.

Implementations of the BaseViewModel can also choose to handle Intents.

Screen State

ScreenState encapsulates all the state required by a Page. State is any data that represents the current situation of a Page.

For example, the HomeScreenState holds the state required by the HomePage.

Effect

Effects are events that take place on a page that are not part of the state of the screen. These usually deal with UI elements that are not part of the widget tree.

Showing a snackbar or hiding the keyboard are examples of an effect.

Intent

Intent is any action that takes place on a page. It may or may not be user initiated.

SearchScreenIntent has the actions that can happen on the SearchPage.

Page

A page is a widget that the navigator can navigate to. It should return the BasePage widget.

The BasePage creates the structure for the page, initialises the ViewModel and provides the view model in the widget tree so that all the children have access to it. It also listens to the effects from the view model and notifies the page about it.

Each page accepts the Screen object as input.

Widgets

Each destination has a widgets directory. It holds all the widgets that appear on a Page excluding the page itself.

Each widget the requires access to data from the view model it split into two dart files. The connector widget communicates with the view model, and the content widget has the actual UI. The connector widget passes all the required data to the content widget. Thus the content widget never depends on the state managent solution used. This helps in easy replacement of state management solution if needed and also makes it easier to test widgets.

Screen

A Screen is a class that represents a Page in the context of navigation. It holds the path used by the navigator to navigate to a Page and also holds any arguments required to navigate to that Page.

Templating

As you can read from the Architecture section, adding a new page in the app can require a lot of files to be created. The template uses mason as it's templating engine to automate some of this work.

To get started with mason, first activate mason globally

dart pub global activate mason_cli

Similar to using pub get we need to run mason get to setup the bricks (templates are called brick in mason).

mason get

You can learn more about mason here.

Destination Brick

The template comes with a pre setup brick called destination. Run the destination brick using the following command.

mason make destination -o lib/presentation/destinations/notes --name notesList 

-o flag sets the output directory for the brick and --name is the name used for the files and classes. This brick generates the required file structure and runs build_runner (via mason hooks) to trigger code generation. After running the command, this is what you should see:

Screenshot 2023-03-21 at 2 55 45 PM

Testing

The template also includes a testing setup for

The test coverage and code quality reporting is done using sonarqube. You can read the documentation about integrating sonarqube in you CI workflow here.

Content

The Flutter Template contains:

The template contains an example (displaying weather data) with responsive widgets, reactive state management, offline storage and api calls.

Continuous Integration and Deployment

The Flutter template comes with built-in support for CI/CD using Github Actions.

CI

The CI workflow performs the following checks on every pull request:

  • Lints the code with flutter analyze.
  • Check formatting with dart format
  • Runs tests using flutter test.
  • Run golden test.
  • Report code coverage and code quality using sonarqube.
  • Build the android app.
  • Build the ios app.

You can read the documentation about integrating sonarqube in you CI workflow here.

CD

The CD workflow performs the following actions:

  • Bump the build number by 1.
  • Build a signed release apk.
  • Upload apk to the app center.
  • Upload apk as artifact to release tag.
  • Build a signed iOS app.
  • Upload ipa to testflight.
  • Upload the ipa as an artifact to release the tag.
  • Commit the updated version to git.

.env files on CD

The CI and CD workflows grab the .env files from github secrets. The secrets are name ENV_ followed by environment name. So for dev the secret name is ENV_DEV, qa is ENV_QA and prod is ENV_PROD. Convert your .env files with all the api keys populated to base64 strings and set them as secrets on github with the appropriate secret name. You can learn more about github actions secrets here.

Android CD setup

For the android CD workflow to run, we need to perform the following setup steps:

  • Follow these instructions to generate an upload keystore. Note down the store password, key alias and key password. You will need these in later steps.
  • Use openssl to convert the jks file to Base64.
openssl base64 < flutter_template_keystore.jks | tr -d '\n' | tee flutter_template_keystore_encoded.txt
  • Store the base64 output on Github Secrets with the key name KEYSTORE.
  • Save the store password in github secrets with the key name RELEASE_STORE_PASSWORD.
  • Save the key alias in github secrets with the key name RELEASE_KEY_ALIAS.
  • Save the key password in github secrets with the key name RELEASE_KEY_PASSWORD.
  • Create a distribution on app center and get the upload key. You can get it from appcenter.ms/settings.
  • Save the app center upload key on github secrets with key name APP_CENTER_TOKEN.

IOS CD Setup

For the IOS job in the cd.yml to run, you first need to have a valid Apple Developer Account.If you don't have it yet, please create one before proceeding further

We will divide the guide into steps so that it is easier to understand

Step 1: Setup on the AppStore

  • Register your Bundle ID. You can view the official Flutter guide here

CAUTION: Apple doesn't allow underscore in the bundle identifier. Read about valid identifiers here

  • Create an application on the AppStore Connect Portal. Check out the official guide here

Step 2: Getting a Distribution Certificate and Provisioning Profile

  • Create a Distribution Certificate for your machine locally once. You can refer to this guide. Download the .p12 file for use later. Remember the password used to create this certificate as we will need this later
  • Create a Provisioning Profile for your Bundle ID you registered above. You can refer to this guide. Download the profile for use later.

Step 3: Getting the options.plist

  • In the following template
    • Replace BUNDLE ID with your Bundle Identifier (You got that already from Step 1)
    • Replace PROVISIONING PROFILE NAME with your Provisioning Profile Name (You already created one in Step 2, use that)
    • Replace TEAM_ID with your team id. Look at this answer on "How to find your Team ID"
Click to View Template
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>generateAppStoreInformation</key>
	<false/>
	<key>manageAppVersionAndBuildNumber</key>
	<true/>
	<key>method</key>
	<string>app-store</string>
	<key>provisioningProfiles</key>
	<dict>
		<key>BUNDLE-ID</key>
		<string>PROVISION PROFILE NAME</string>
	</dict>
	<key>signingCertificate</key>
	<string>Apple Distribution</string>
	<key>signingStyle</key>
	<string>manual</string>
	<key>stripSwiftSymbols</key>
	<true/>
	<key>teamID</key>
	<string>TEAM_ID</string>
	<key>uploadBitcode</key>
	<false/>
	<key>uploadSymbols</key>
	<true/>
</dict>
</plist>
  • Create a new file called options.plist and save the above contents in that file

Step 4: Making an app specific password

  • Read the official guide to create an app specific password and remember it(;P)
  • The pipeline uses this password to upload an ipa to testflight

Step 5: Bringing it all together

  • Add the following keys to Github Secrets
    • BUILD_CERTIFICATE_BASE64 : The base64 of the p12 file we generated(Step 2)
    • P12_PASSWORD: The password of the p12 certificate generated above in Step 2
    • BUILD_PROVISION_PROFILE_BASE64: The provisioning profile in base64(Step 2)
    • KEYCHAIN_PASSWORD : The password used to store the keychain in the local keystore of the Github Runner(Any random value)
    • IOS_PLIST: The options.plist file needed to make an ipa out of the xcarchive generated by flutter(Step 3)
    • APPSTORE_PASSWORD: The password passed to altool to upload the ipa to the store(Step 4)
  • To generate a base64 string, use the following command, replacing FILENAME with your filename
openssl base64 < FILENAME | tr -d '\n' | tee ENCODED_FILENAME.txt

Pushing to protected branches

  • If the branches that you will be running CD on are protected, you will need to use a Personal Access Token (PAT) to commit the version changes.
  • After creating the PAT, exclude the account that the token belongs to from the branch protection rules.
  • Save the token in github secrets and update the key name in the cd.yml file under each checkout action.
  • Since our CD workflow is triggered on a push, and we create a new commit in the workflow itself, the commit message created by the CD workflow includes [skip ci] tag so that the workflow does not end up in an infinite loop. Read more about this here

If you do not plan to use the CD workflow on protected branches, you can remove the token part from the checkout actions.

Gotchas

Refresh Rate

Flutter apps might have issues on some android devices with variable refresh rate where the app is locked at 60fps instead of running at the highest refresh rate. This might make your app look like it is running slower than other apps on the device. To fix this the template uses the flutter_displaymode package. The template sets the highest refresh rate available. If you don't want this behaviour you can remove the lines 40 to 46 in app.dart. Link to frame rate issue on flutter.

Golden Tests

Golden test screenshots (goldens) are rendered using the rendering mechanisms on the os that you are running the tests on. Because of the slight differences in each os, the goldens generated on each os differ slightly from each other. Goldens generated on macos won't match exactly to the goldens generated on windows or linux and your tests will fail. To work around this, make sure to generate goldens and run golden tests on a single os. This template uses macos as it's os of choice to deal with goldens. You will find that on CI, the golden tests are run on a macos host.

  • What if your team members use different operating systems for development? - In that case, the devs not using your os of choice should have a way to generate goldens on your os of choice. This template has a update_goldens workflow that can be manually triggered on any branch. It will generate the golden files on macos and commit the changes to the same branch.

License

Flutter Template is licensed under the MIT license. Check the LICENSE file for details.

Other Versions

Check out the multi-package branch for a multi package flutter architecture.

More Repositories

1

CreditCardEditText

Android EditText extension that matches a credit card number to its type. Also provides a highly customizable interface.
Java
136
star
2

react-template

An enterprise react template application showcasing - Testing strategy, Global state management, middleware support, a network layer, component library integration, localization, PWA support, route configuration, lazy loading and CI/CD
JavaScript
86
star
3

react-native-template

An enterprise react-native template application showcasing - Testing strategy, Global state management, middleware support, a network layer, component library integration, localization, navigation configuration and CI
JavaScript
42
star
4

react-floki

A CLI tool that works with the react template and allows you to scaffold tests, containers, components and stitches them all together preventing wastage of time in setup and boilerplate code.
JavaScript
38
star
5

node-express-graphql-template

An enterprise Express GraphQL template application built using nodejs showcasing - Testing Strategy, DB migrations and seeding, integration with an ORM, containerization using Docker, GraphQL Interface, support for GraphQL relay, integration with graphql-sequelize, support for aggregation queries, PostgreSQL
JavaScript
34
star
6

go-template

An enterprise GraphQL template application built using Golang showcasing - Testing Strategy, DB migrations and seeding, integration with an ORM, containerization using Docker, GraphQL Interface, PostgreSQL, subscriptions, redis caching, paginated endpoints.
Go
28
star
7

node-mongo-express

An enterprise Mongo-Express REST API built using nodejs showcasing - Testing Strategy, mongoDB sharding, models, a REST API Interface, support for Redis, aggregation queries, aggregation caching, circuit-breakers, slack integration, RBAC, rate limited APIs and multi-container queues and schedulers.
JavaScript
28
star
8

nodejs-hapi-template

A Nodejs hapi boilerplate application with out of the box support for Docker, Redis cache, DB migrations and seeders, rate limiting, and paginated endpoints.
JavaScript
25
star
9

appsync-rds-todo

This is a boilerplate AppSync-aurora project, that is deployed using the serverless framework with out of the box support for automated creation of a Serverless database cluster, lambdas, vpcs, security groups, nat gateways, etc.
JavaScript
24
star
10

serverless

A repository of serverless applications showcasing how to orchestrate cloud infrastructure for varied use cases with multiple cloud infrastructure providers.
JavaScript
22
star
11

next-bulletproof-ts

TypeScript
18
star
12

android-template

An Android template application showcasing: Multi modular clean architecture, reactive patterns, dependency injection, integration with jetpack libraries, testing and CI/CD.
Kotlin
16
star
13

temporal-ecs

A temporal deployment tool which lets you setup , deploy and get your temporal service running on ECS in few minutes. This tool deploys Temporal Server , RDS , OpenSearch and Temporal UI. AWS Copilot is used to do the deployment part.
Shell
15
star
14

service-picker

A CLI tool that allows you to create batteries and integrated full-stack products. Pick from a range of frontend and backend templates, chose your favorite database, and sit back and relax while we deploy to AWS. Don’t worry about future deployments it comes with baked-in CI/CD pipelines
Go
14
star
15

cloudnative-template

K8s template that is fully cloudnative!
TypeScript
14
star
16

jsonapi-redux-data

JSONAPI middleware for redux
JavaScript
13
star
17

go-kafka-example

A monorepo, microservice setup with full support for CI/CD, kafka as a message broker, inter-service API using service discovery endpoint
Go
12
star
18

react-graphql-ts-template

An enterprise react graphql template application showcasing - Testing strategy, Global state management, middleware support, a network layer, component library integration, localization, PWA support, route configuration, lazy loading and CI/CD
TypeScript
12
star
19

react-screentype-hook

React hook to get screen type(mobile, tablet, desktop, largeDesktop)
JavaScript
11
star
20

ios-template

An enterprise iOS template application showcasing - Testing strategy, MVVM-C architecture, a network layer, handling secrets, localisation, navigation configuration and CI
Swift
10
star
21

nextjs-template

An enterprise Next.js template application showcasing - Testing strategies, Global state management, Custom environments, a network layer, component library integration, localization, Image loading, Custom App, Custom document, IE 11 compatibility and Continuous integration & deployment.
JavaScript
10
star
22

serverless-template

Cloud management demands efficiency, and the Serverless Template is your key to streamline and simplify. Your ready to use batteries included serverless-framework boilerplate. Comes with lambdas, rds, and a bunch of things pre-configured
JavaScript
9
star
23

graphql-testkit

A utility tool that generates a postman collection with all the mutations and queries that your GraphQL endpoint exposes.
JavaScript
9
star
24

kafka-node-example

TypeScript
8
star
25

go-template-mysql

An enterprise GraphQL template application built using Golang showcasing - Testing Strategy, DB migrations and seeding, integration with an ORM, containerization using Docker, GraphQL Interface, MySQL, subscriptions, redis caching, paginated endpoints.
Go
7
star
26

golang-algorithm-club

This project is an effort to write some of the most commonly used algorithms and data structures in golang.
Go
6
star
27

ecs-signoz

A one stop shop for your Signoz-ECS needs. This repository contains crafty scripts to supercharge your application observability using SigNoz and a single command
Shell
6
star
28

negt-cli

GraphQL auto generation cli app.
Go
6
star
29

Ember-Color

A collection of color picker components for Emberjs
JavaScript
5
star
30

ws-observability-chart

Shell
5
star
31

chart_it

A customisable and seamlessly animated charts library for flutter
Dart
5
star
32

ws-react-sdk

Common components
JavaScript
5
star
33

Wednesday-Playbook

4
star
34

aurora-serverless-cluster-migrations-starter

JavaScript
4
star
35

dart-algorithm-club

Dart
4
star
36

cognito-cli

JavaScript
2
star
37

automated-releases

2
star
38

node-express-batch-jobs-starter

JavaScript
1
star
39

aws-copilot-node-demo

JavaScript
1
star
40

react-fallback-uat-starter

JavaScript
1
star
41

android-style-guide

Android Style Guide
1
star
42

ecs-appmesh-config

Shell
1
star