• Stars
    star
    118
  • Rank 299,923 (Top 6 %)
  • Language
    Dart
  • License
    MIT License
  • Created over 2 years ago
  • Updated 9 months ago

Reviews

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

Repository Details

Table of contents

Flutter Clean Architecture Sample App - Dasher

This project is a starting point for a Flutter application. Dasher App will introduce you to clean architecture structure and how inner / outer layers are connected.

Architecture structure

Dasher app uses the architecture structure described in handbook.

flutter-architecture-layers

Presentation

There is no business logic on this layer, it is only used to show UI and handle events. Read more about Presentation layer in handbook.

Widgets (UI)

  • Notify presenter of events such as screen display and user touch events.
  • Observes presenter state and can rebuild on state change.

Presenter

  • Contains presentation logic, usually controlling the view state.

Domain

This layer is responsible for business logic.

Interactor

  • The main job of the interactor is combining different repositories and handling business logic.

Data Holder

  • Singleton class that holds data in memory, that doesn't call repositories or other outer layers.

Outer layer

Repository

  • It uses concrete implementations like dio, hive, add2calendar, other plugins and abstracts them from the rest of the application.
  • Repository should be behind and interface.
  • Interface belongs to the domain and the implementation belongs to the outer layers.

Source remote

  • Represents communication with remote sources (web, http clients, sockets).

Source local

  • Represents communication with local sources (database, shared_prefs).

Device

  • Represents communication with device hardware (e.g. sensors) or software (calendar, permissions).

Folder structure

Top-level folder structure you will find in the project under the /lib:

img_project_structure

  • app contains app run_app with various setups like the setup of flutter.onError crash handling and dependency initialization.
  • common contains code that's common to all layers and accessible by all layers.
  • device is an outer layer that represents communication with device hardware (e.g. sensors) or software (calendar, permissions).
  • domain is the inner layer that usually contains interactors, data holders. This layer should only contain business logic and not know about specific of ui, web, etc. or other layers.
  • source_local is an outer layer that represents communication with local sources (database, shared_prefs).
  • source_remote is an outer layer that represents communication with remote sources (web, http clients, sockets).
  • ui is the layer where we package by feature widgets and presenters. Presenters contains presentation logic and they access domain and are provided in the view tree by Provider/Riverpod package.
  • main_production.dart and main_staging.dart two versions of main file, each version has it's own flavor in practice this usually means having two versions. Find more about flavors here.

Riverpod and GetIt

This architecture structure is using Riverpod for Presentation layer and GetIt for Domain and outer layers (source remote, source local and device).

Read more about how to use riverpod in handbook.

flutter-architecture-layers-riverpod-getit

Example of architecture flow

In this example, we'll show the architecture flow for fetching new Tweets on the Dashboard screen.

Presentation

Widget

flutter-architecture-layers-riverpod-getit (2)

One of the widgets on the Dashboard screen is DasherTweetsList. Inside the Tweets list widget is created reference to watch feedRequestPresenter.

final _presenter = ref.watch(feedRequestPresenter);

Presenter

flutter-architecture-layers-riverpod-getit (3)

For FeedRequestPresenter we are using RequestProvider, you can find more about it here.

Inside FeedRequestPresenter we created instance of FetchFeedInteractor interface.

final feedRequestPresenter = ChangeNotifierProvider.autoDispose<FeedRequestPresenter>(
  (ref) => FeedRequestPresenter(GetIt.instance.get()),
);

class FeedRequestPresenter extends RequestProvider<List<Tweet>> {
  FeedRequestPresenter(this._feedTimelineInteractor) {
    fetchTweetsTimeline();
  }

  final FetchFeedInteractor _feedTimelineInteractor;

  Future<void> fetchTweetsTimeline() {
    return executeRequest(requestBuilder: _feedTimelineInteractor.fetchFeedTimeline);
  }
}

From this part, we slowly transition toward Domain layer.

Domain

Interactor

flutter-architecture-layers-riverpod-getit (4)

Domain is a business logic layer, where we have an implementation of FetchFeedInteractor called FetchFeedInteractorImpl. Our task is to create an instance of Repository which is responsible for handling outer logic for getting user timeline tweets. FeedRepository is also behind an interface.

class FetchFeedInteractorImpl implements FetchFeedInteractor {
  FetchFeedInteractorImpl(this._feedRepository);

  final FeedRepository _feedRepository;

  @override
  Future<List<Tweet>> fetchFeedTimeline() {
    return _feedRepository.fetchFeedTimeline();
  }
}

Repository

flutter-architecture-layers-riverpod-getit (5)

FeedRepositoryImpl is part of Source remote layer. This repository is using twitter_api_v2 package for fetching data from Twitter's API.

Future<List<Tweet>> fetchFeedTimeline() async {
  final response = await twitterApi.tweetsService.lookupHomeTimeline(
    userId: userDataHolder.user!.id,
    tweetFields: [
      TweetField.publicMetrics,
      TweetField.createdAt,
    ],
    userFields: [
      UserField.createdAt,
      UserField.profileImageUrl,
    ],
    expansions: [
      TweetExpansion.authorId,
    ],
  );

  return _getTweetsListWithAuthors(response);
}

after a successful response, data is passed back to FeedRequestPresenter in his state, and it triggers state listeners. Inside the build method of DasherTweetsList we use state listeners of FeedRequestPresenter so we can easily show/hide widgets depending on the emitted event.

flutter-architecture-layers-riverpod-getit (6)

  _presenter.state.maybeWhen(
    success: (feed) => _TweetsList(
      feed: feed,
    ),
    initial: () => const CircularProgressIndicator(),
    loading: (feed) {
      if (feed == null) {
        return const CircularProgressIndicator();
      } else {
        return _TweetsList(
          feed: feed,
        );
      }
    },
    failure: (e) => Text('Error occurred $e'),
    orElse: () => const CircularProgressIndicator(),
  ),

Screenshots

Login Feed
Profile New Tweet

Infinum architecture Mason brick

Easiest way to set up our architecture in the project is with usage of Mason bricks. The infinum_architecture brick is published on https://brickhub.dev/bricks/infinum_architecture/ and it will generate all the required directories and files ready to start the project.

How to use

Tools to install

Make sure you have installed FVM - Flutter Version Management.

dart pub global activate fvm

Also install Mason CLI it's must have for using Mason bricks.

dart pub global activate mason_cli

Create new project

Create new Flutter project:

flutter create {project_name}

move to project folder:

cd {project_name}

Mason brick setup

Initialize mason:

mason init

Add mason brick to your project:

mason add infinum_architecture

Start generating Infinum architecture folder structure:

mason make infinum_architecture --on-conflict overwrite

Variables

Variable Description Default Type
project_name This name is used to name main function and files run{project_name}App() example string
flutter_version Defines which version of FVM you want to install stable string
brick_look Optional Look true bool
brick_request_provider Optional Request Provider true bool

Outputs

πŸ“¦ lib
 ┣ πŸ“‚ app
 ┃ ┣ πŸ“‚ di
 ┃ ┃ β”— πŸ“„ inject_dependencies.dart
 ┃ ┣ πŸ“„ example_app.dart
 ┃ β”— πŸ“„ run_example_app.dart
 ┣ πŸ“‚ common
 ┃ ┣ πŸ“‚ error_handling
 ┃ ┃ ┣ πŸ“‚ base
 ┃ ┃ ┃ ┣ πŸ“„ expected_exception.dart
 ┃ ┃ ┃ β”— πŸ“„ localized_exception.dart
 ┃ ┃ β”— πŸ“„ error_formatter.dart
 ┃ ┣ πŸ“‚ flavor
 ┃ ┃ ┣ πŸ“„ app_build_mode.dart
 ┃ ┃ ┣ πŸ“„ flavor.dart
 ┃ ┃ ┣ πŸ“„ flavor_config.dart
 ┃ ┃ β”— πŸ“„ flavor_values.dart
 ┃ β”— πŸ“‚ logger
 ┃   ┣ πŸ“„ custom_loggers.dart
 ┃   β”— πŸ“„ firebase_log_printer.dart
 ┣ πŸ“‚ device
 ┃ β”— πŸ“‚ di
 ┃   β”— πŸ“„ inject_dependencies.dart
 ┣ πŸ“‚ domain
 ┃ β”— πŸ“‚ di
 ┃   β”— πŸ“„ inject_dependencies.dart
 ┣ πŸ“‚ source_local
 ┃ β”— πŸ“‚ di
 ┃   β”— πŸ“„ inject_dependencies.dart
 ┣ πŸ“‚ source_remote
 ┃ β”— πŸ“‚ di
 ┃   β”— πŸ“„ inject_dependencies.dart
 ┣ πŸ“‚ ui
 ┃ ┣ πŸ“‚ common
 ┃ ┃ ┣ πŸ“‚ generic
 ┃ ┃ ┃ β”— πŸ“„ generic_error.dart
 ┃ β”— πŸ“‚ home
 ┃   β”— πŸ“„ home_screen.dart
 ┣ πŸ“„ main_production.dart
 β”— πŸ“„ main_staging.dart

More Repositories

1

android_dbinspector

Android library for viewing, editing and sharing in app databases.
Kotlin
951
star
2

rails-handbook

Describing the development process used by the Infinum Rails Team.
Slim
763
star
3

FBAnnotationClustering

iOS library for clustering map notifications in an easy and performant way
Objective-C
713
star
4

Android-Goldfinger

Android library to simplify Biometric authentication implementation.
Java
653
star
5

ios-viper-xcode-templates

Used for generating template files for the VIPER architecture, which solves the common Massive View Controller issues in iOS apps.
HTML
576
star
6

phrasing

Edit phrases inline for your Ruby on Rails applications!
Ruby
545
star
7

eightshift-boilerplate

This repository contains all the tools you need to start building a modern WordPress theme, using all the latest front end development tools.
PHP
511
star
8

Android-GoldenEye

A wrapper for Camera1 and Camera2 API which exposes simple to use interface.
Kotlin
376
star
9

cookies_eu

Gem to add cookie consent to Rails application
Haml
269
star
10

dox

Automated API documentation from Rspec
Ruby
234
star
11

MjolnirRecyclerView

[DEPRECATED] This library is no longer maintained and it will not receive any more updates.
Java
218
star
12

ios-nuts-and-bolts

iOS bits and pieces that you can include in your project to make your life a bit easier.
Swift
195
star
13

Japx

Lightweight parser for the complex JSON:API (http://jsonapi.org/) structure.
Swift
152
star
14

flutter-charts

Customizable charts library for flutter.
Dart
142
star
15

datx

DatX is an opinionated JS/TS data store. It features support for simple property definition, references to other models and first-class TypeScript support.
TypeScript
138
star
16

learnQuery

Learn JavaScript fundamentals by building your own jQuery equivalent library
JavaScript
137
star
17

floggy

Customizable logger for dart and flutter applications.
Dart
117
star
18

android-complexify

An Android library which makes checking the quality of user's password a breeze.
Java
113
star
19

Android-Prince-of-Versions

Android library for handling application updates.
Java
104
star
20

android_connectionbuddy

Utility library for handling connectivity change events.
Java
94
star
21

eightshift-docs

A documentation website for Eightshift open source projects
MDX
84
star
22

Retromock

Java library for mocking responses in a Retrofit service.
Kotlin
68
star
23

eightshift-frontend-libs

Frontend library that exposes custom scripts and styles for modern WordPress projects
JavaScript
68
star
24

eightshift-libs

Library that is meant to be used inside Eightshift Boilerplate and Eightshift Boilerplate Plugin libs via composer in order to be able to easily set up a modern development process.
PHP
61
star
25

frontend-handbook

Our handbook based on 10 years of experience in Frontend/JS development
Slim
57
star
26

Locker

Securely lock your secrets under the watch of TouchID or FaceID keeper πŸ”’
Swift
50
star
27

emotion-normalize

normalize.css but for emotion.js
JavaScript
50
star
28

mobx-jsonapi-store

JSON API Store for MobX
TypeScript
48
star
29

Dagger-2-Example

Dagger 2 example project
Java
44
star
30

ios-prince-of-versions

Library used for easier versioning of your applications, allowing you to prompt your users to update the app to the newest version
Swift
43
star
31

android-sentinel

Sentinel is a simple one screen UI which provides a standardised entry point for tools used in development and QA alongside device, application and permissions data.
Kotlin
38
star
32

enumerations

Better Rails Enumerations
Ruby
37
star
33

kotlin-jsonapix

JsonApiX is an Android, annotation processor library that was made to transform regular Kotlin classes into their JSON API representations, with the ability to serialize or deserialize them to or from strings.
Kotlin
37
star
34

eightshift-boilerplate-plugin

This repository contains all the tools you need to start building a modern WordPress plugin.
PHP
36
star
35

mobx-collection-store

Data collection store for MobX
TypeScript
35
star
36

decoupled-json-content

JavaScript
30
star
37

wordpress-handbook

Official WordPress handbook at Infinum
Slim
30
star
38

webpack-asset-pipeline

πŸš€ A missing link for the asset pipeline alternative with Webpack.
JavaScript
30
star
39

ios-loggie

Simplify debugging by showing network requests of your app as they happen.
Swift
30
star
40

eightshift-forms

WordPress plugin project for Gutenberg forms
PHP
29
star
41

flutter-plugins-locker

Flutter plugin that secures your secrets in keychain using biometric authentication (Fingerprint, Touch ID, Face ID...).
Dart
29
star
42

default_rails_template

Default template for generating new Rails applications.
Ruby
27
star
43

media-blender

Easy and predictable SASS/SCSS media queries
CSS
26
star
44

android-collar

Gradle plugin which collects all analytics screen names, events and user properties for Android projects.
Kotlin
26
star
45

secrets_cli

CLI for storing and reading your secrets via vault
Ruby
25
star
46

flutter-plugins-japx

JSON API parser for Flutter
Dart
25
star
47

flutter-bits

Flutter
Dart
22
star
48

react-mobx-translatable

Make React components translatable using MobX
JavaScript
21
star
49

dungeons-and-dragons

🎲 Dungeons & Dragons Character builder and keeper (work in progress)
TypeScript
19
star
50

android-crash-handler

Utility library which handles crash handler configuration
Java
19
star
51

qa-handbook

Describing the processes used by the Infinum QA Team
Slim
18
star
52

iOS-Bugsnatch

Swift
18
star
53

eightshift-coding-standards

Eightshift coding standards for WordPress
PHP
16
star
54

jsonapi-query_builder

Ruby
14
star
55

thrifty-retrofit-converter

Retrofit converter which uses Thrifty for Apache Thrift-compatible serialization
Java
13
star
56

json-wp-post-parser

JSON Post Parser plugin parses your content and saves it as JSON available in REST posts and pages endpoints.
PHP
13
star
57

swift-style-guide

12
star
58

react-responsive-ssr

TypeScript
11
star
59

redbreast

iOS strong image typing library
Ruby
11
star
60

generator-infinitely-static

πŸ’« Static page generator with routes support thats infinitely awesome
JavaScript
10
star
61

ngx-hal

Angular datastore library with HAL support
TypeScript
10
star
62

fiscalizer

A gem for fiscalizing invoices in Croatia using Ruby.
Ruby
9
star
63

ember-form-object

Form object pattern in ember apps
JavaScript
9
star
64

JS-React-Example

Infinum's way of doing React
TypeScript
9
star
65

js-talks

✨ Interesting talks and mini lectures about new and cool stuff that's going on in the world of JS development, organized by the Infinum JS team
9
star
66

android-handbook

Slim
8
star
67

js-linters

Infinum's JS team linter rules
TypeScript
7
star
68

auth-worker

OAuth2 Service Worker handler
TypeScript
7
star
69

array_validator

Array Validations for ActiveModel
Ruby
7
star
70

eightshift-storybook

Storybook package for Eightshift-Boilerplate
7
star
71

icomcom-react

πŸ’¬ A React component for handling communication with content in <iframe />
JavaScript
7
star
72

dox-demo

Demo app for dox gem:
HTML
6
star
73

android-localian

Android library that manages your application locale and language across multiple Android API levels.
Kotlin
6
star
74

ios-handbook

Slim
6
star
75

flutter-prince-of-versions

Library used for easier versioning of your applications, allowing you to prompt your users to update the app to the newest version
Dart
6
star
76

learn-react

πŸ‘‹ βš›οΈ Learn React by implementing your own!
TypeScript
5
star
77

I18n-js

Javascript library for string internationalization.
CoffeeScript
5
star
78

ios-collar

In-app analytics debugging tool
Swift
5
star
79

ngx-form-object

Reactive forms manager
TypeScript
5
star
80

ios-sentinel

Developer’s toolbox for debugging applications
Swift
4
star
81

mobx-keys-store

Keys store for MobX
TypeScript
4
star
82

mysterious-sampler

Swift
4
star
83

rails-infinum-jsonapi_example_app_old

Ruby
4
star
84

phrasing_plus

Phrasing extension for editing images inline
Ruby
4
star
85

eightshift-web-components

Web components library that exposes custom scripts and styles for modern WordPress projects
Svelte
4
star
86

Install-Flutter-Version-Manager-Bitrise

Shell
4
star
87

infinum_setup

Setup script
Ruby
4
star
88

loglevel-filesave

Loglevel plugin for saving logs to the file
JavaScript
4
star
89

eightshift-blocks

Project dedicated to use inside WP Boilerplate and WP Boilerplate Plugin projects via composer to be able to easily setup modern development process for Gutenberg blocks..
PHP
3
star
90

data_sync

Rails plugin for database and file synchronization
Ruby
3
star
91

docusaurus-theme

Infinum Docusaurus teme
JavaScript
3
star
92

next-passenger

next.js with passenger proof of concept
Dockerfile
3
star
93

SocketMan

Android WebSocket client app
Java
3
star
94

react-asset-collector

Collect assets from react components so you can do HTTP2 push
JavaScript
3
star
95

rails_log_book

Ruby
3
star
96

mina-secrets

Mina plugin for secrets_cli gem
Ruby
2
star
97

ngx-nuts-and-bolts

A collection of commonly used pieces of Angular-related code that we use everyday at Infinum.
TypeScript
2
star
98

money_with_date

Extension for the money gem which adds dates to Money objects.
Ruby
2
star
99

blog-android-permissions

Java
2
star
100

JS-RxWorkshop

TypeScript
2
star