# Books add-to-app sample

This application simulates a mock scenario in which an existing app with
business logic and middleware already exists. It demonstrates how to add Flutter
to an app that has established patterns for these domains. For more information
on how to use it, see the [README.md](../README.md) parent directory.

This application also utilizes the [Pigeon](https://pub.dev/packages/pigeon)
plugin to avoid manual platform channel wiring. Pigeon autogenerates the
platform channel code in Dart/Java/Objective-C to allow interop using higher
order functions and data classes instead of string-encoded methods and
serialized primitives.

The Pigeon autogenerated code is checked-in and ready to use. If the schema
in `pigeon/schema.dart` is updated, the generated classes can also be re-
generated using:

```shell
flutter pub run pigeon --input pigeon/schema.dart \
  --dart_out lib/api.dart \
  --objc_header_out ../ios_books/IosBooks/api.h \
  --objc_source_out ../ios_books/IosBooks/api.m \
  --objc_prefix BK \
  --java_out ../android_books/app/src/main/java/dev/flutter/example/books/Api.java \
  --java_package "dev.flutter.example.books"
```

## Demonstrated concepts

* An existing books catalog app is already implemented in Kotlin and Swift.
* The platform-side app has existing middleware constraints that should also
  be the middleware foundation for the additional Flutter screen.
    * On Android, the Kotlin app already uses GSON and OkHttp for networking and
      references the Google Books API as a data source. These same libraries
      also underpin the data fetched and shown in the Flutter screen.
* The platform application interfaces with the Flutter book details page using
  idiomatic platform API conventions rather than Flutter conventions.
    * On Android, the Flutter activity receives the book to show via activity
      intent and returns the edited book by setting the result intent on the
      activity. No Flutter concepts are leaked into the consumer activity.
* The [pigeon](https://pub.dev/packages/pigeon) plugin is used to generate
  interop APIs and data classes. The same `Book` model class is used within the
  Kotlin/Swift program, the Dart program and in the interop between Kotlin/Swift
  and Dart.

## More info

For more information about Flutter, check out
[flutter.dev](https://flutter.dev).

For instructions on how to integrate Flutter modules into your existing
applications, see Flutter's
[add-to-app documentation](https://flutter.dev/docs/development/add-to-app).
