# multiple_flutters

This is a sample that shows how to use the Flutter Engine Groups API to embed
multiple instances of Flutter into an existing Android or iOS project.

## Getting Started

For iOS instructions, see:
[multiple_flutters_ios](./multiple_flutters_ios/README.md).

For Android instructions, see:
[multiple_flutters_android](./multiple_flutters_android/README.md).

## Requirements

* Flutter -- after Flutter v2
* Android
  * Android Studio
* iOS
  * Xcode
  * Cocoapods

## Flutter Engine Group

These examples use the Flutter Engine Group APIs on the host platform which
allows engines to share memory and CPU intensive resources. This leads to easier
embedding of Flutter into an existing app since multiple entrypoints can be
maintained via a FlutterFragment on Android or a UIViewController on iOS.
Before FlutterEngineGroup, users had to juggle the usage of a small number of
engines judiciously.

More info on those API's can be found in the source
code:

- iOS -
  [FlutterEngineGroup.h](https://github.com/flutter/engine/blob/master/shell/platform/darwin/ios/framework/Headers/FlutterEngineGroup.h)
- Android -
  [FlutterEngineGroup.java](https://github.com/flutter/engine/blob/master/shell/platform/android/io/flutter/embedding/engine/FlutterEngineGroup.java)

## Important Files

### iOS

- [DataModel.swift](./multiple_flutters_ios/MultipleFluttersIos/HostViewController.swift)
  — Observable data model that is the source of truth for the host platform and Flutter.
- [HostViewController.swift](./multiple_flutters_ios/MultipleFluttersIos/HostViewController.swift)
  — A UIViewController that synchronizes to the DataModel.
- [main.dart](./multiple_flutters_module/lib/main.dart) — The Flutter source
  code.
- [SingleFlutterViewController.swift](./multiple_flutters_ios/MultipleFluttersIos/SingleFlutterViewController.swift)
  — A subclass of FlutterViewController that synchronizes with the DataModel.
- [DoubleFlutterViewController.swift](./multiple_flutters_ios/MultipleFluttersIos/DoubleFlutterViewController.swift)
  — A UIViewController that embeds multiple Flutter instances.

### Android

## Data Synchronization Description

This sample code performs data synchronization to share data between the host
platform and multiple instances of Flutter by combining the
[Observer design pattern](https://en.wikipedia.org/wiki/Observer_pattern) and
[Flutter platform channels](https://flutter.dev/docs/development/platform-integration/platform-channels).
Here is how it works:

- The definitive source of truth for the data lives in the host platform data
  model.
- Every host view displaying Flutter content maintains: a Flutter engine, a
  bidirectional platform channel, and a subscription to the host data model.
- Flutter instances maintain a copy of the data they are interested in reading,
  and this data is seeded by the host when the instance is first displayed.
- Mutations from Flutter code are sent to the host platform via the channel. The
  host platform performs the mutations, and then notifies all host view
  controllers and Flutter engines of the new value.
- Mutations from host code happen directly on the data model who notifies host
  view controllers and Flutter engines of the new value.

This is just one possible way to synchronize the data between the host platform
and multiple Flutter instances. A more complete implementation is proposed in
the work of
[flutter/issues/72030](https://github.com/flutter/flutter/issues/72030).
