Flutter Flavorizr

A flutter utility to easily create flavors in your flutter application

Pub Dart CI Star on GitHub License: MIT

Getting Started

Let's start by setting up our environment in order to run Flutter Flavorizr

Prerequisites

Side note: this tool works better on a new and clean Flutter project. Since some processors reference some existing files and a specific base structure, it could be possible that running Flutter Flavorizr over an existing project could throw errors.

Before running Flutter Flavorizr, you must install the following software:

These prerequisites are needed to manipulate the iOS project and schemes. If you are interested in flavorizing Android only, you can skip this step. Keep in mind that you will have to use a custom instructions set with Android and Flutter processors only, otherwise an error will occur.

Installation

This package is intended to support development of Dart projects. In general, put it under dev_dependencies, in your pubspec.yaml:

dev_dependencies:
  flutter_flavorizr: ^1.0.3

You can install packages from the command line:

pub get

Create your flavors

Once all of the prerequisites have been installed and you have added flutter_flavorizr as a dev dependency, you have to edit your pubspec.yaml and define the flavors.

Example

Add a new key named flavorizr and define two sub-items: app and flavors. Under the flavors array you can define the name of the flavors, in our example apple and banana. For each flavor you have to specify the app name, the applicationId and the bundleId.

flavorizr:
  app:
    android:
      flavorDimensions: "flavor-type"
    ios:

  flavors:
    apple:
      app:
        name: "Apple App"

      android:
        applicationId: "com.example.apple"

      ios:
        bundleId: "com.example.apple"

    banana:
      app:
        name: "Banana App"

      android:
        applicationId: "com.example.banana"
      ios:
        bundleId: "com.example.banana"

Available fields

flavorizr

keytypedefaultrequireddescription
appObjecttrueAn object describing the general capabilities of an app
flavorsArraytrueAn array of items. Each of them describes a flavor configuration
instructionsArrayfalseAn array of instructions to customize the flavorizr process
assetsUrlStringhttps://github.com/AngeloAvv/flutter_flavorizr/releases/download/v1.0.3/assets.zipfalseA string containing the URL of the zip assets file. The default points to the current release
ideStringfalseThe IDE in which the app is being developed. Currently only vscode or idea
Available instructions
valuecategorydescription
assets:downloadMiscellaneousDownloads the assets zip from the network
assets:extractMiscellaneousExtracts the downloaded zip in the project .tmp directory
assets:cleanMiscellaneousRemoves the assets from the project directory
android:buildGradleAndroidAdds the flavors to the Android build.gradle file
android:androidManifestAndroidChanges the reference of the app name in the AndroidManifest.xml
android:dummyAssetsAndroidGenerates some default icons for your custom flavors
flutter:flavorsFlutterCreates the flutter flavor configuration file
flutter:appFlutterCreates the app.dart entry
flutter:pagesFlutterCreates a set of default pages for the app
flutter:targetsFlutterCreates a set of targets for each flavor instance
ios:xcconfigiOSCreates a set of xcconfig files for each flavor and build configuration
ios:buildTargetsiOSCreates a set of build targets for each flavor and build configuration
ios:schemaiOSCreates a set of schemas for each flavor
ios:dummyAssetsiOSGenerates some default icons for your custom flavors
ios:plistiOSUpdates the info.plist file
ios:launchScreeniOSCreates a set of launchscreens for each flavor
ide:configIDEGenerates debugging configurations for each flavor of your IDE

android (under app)

keytypedefaultrequireddescription
flavorDimensionsString"flavor-type"falseThe value of the flavorDimensions in the android build.gradle file

app (under flavorname)

keytypedefaultrequireddescription
nameStringtrueThe name of the App

android (under flavorname)

keytypedefaultrequireddescription
applicationIdStringtrueThe applicationId of the Android App
generateDummyAssetsbooltruefalseTrue if you want to generate dummy assets (icon set, strings, etc)

ios (under flavorname)

keytypedefaultrequireddescription
bundleIdStringtrueThe bundleId of the iOS App
generateDummyAssetsbooltruefalseTrue if you want to generate dummy assets (xcassets, etc)

Usage

When you finished defining the flavorizr configuration, you can proceed by running the script with:

flutter pub run flutter_flavorizr

Run your flavors

Once the process has generated the flavors, you can run them by typing

flutter run --flavor <flavorName> -t lib/main-<flavorName>.dart

Example

flutter run --flavor apple -t lib/main-apple.dart
flutter run --flavor banana -t lib/main-banana.dart

Customize your app

Flutter_flavorizr creates different dart files in the lib folder. In the flavors.dart file we have the F class which contains all of our customizations.

class F {
  static Flavor appFlavor;

  static String get title {
    switch (appFlavor) {
      case Flavor.APPLE:
        return 'Apple App';
      case Flavor.BANANA:
        return 'Banana App';
      default:
        return 'title';
    }
  }

}

The process creates a simple title customization: a switch which checks the current appFlavor (defined in our app starting point) and returns the correct value. Here you can write whatever you want, you can create your custom app color palette, differentiate the URL action of a button, and so on.

If you are wondering how to use these getters, you can find an example under the pages folder: in the my_home_page.dart file, the page shown after the launch of the app, we can see a clear reference on the title getter defined in the F class.

Further developments

  • Let the user define its custom set of available instructions.
  • Create Firebase processors.
  • Use a groovy parser to better manipulate the build.gradle file

Please feel free to submit new issues if you encounter some problems with it.

License

Flutter Flavorizr is available under the MIT license. See the LICENSE file for more info.

Libraries

abstract_file_processor
abstract_file_string_processor
abstract_processor
android
android
android_build_gradle_processor
android_dummy_assets_processor
android_manifest_processor
app
app
configuration
constants
copy_file_processor
copy_folder_processor
delete_file_processor
download_file_processor
dummy_assets_processor
enums
existing_file_string_processor
file_not_found_exception
flavor
flavorizr
flutter_flavorizr
flutter_flavors_processor
flutter_target_file_processor
flutter_targets_file_processor
ide_processor
idea_launch_file_processor
idea_launch_processor
idea_run_configurations_processor
ios
ios
ios_build_configurations_processor
ios_build_configurations_targets_processor
ios_dummy_assets_processor
ios_dummy_assets_targets_processor
ios_plist_processor
ios_schemas_processor
ios_target_launchscreen_file_processor
ios_targets_launchscreen_file_processor
ios_utils
ios_xcconfig_file_processor
ios_xcconfig_mode_file_processor
ios_xcconfig_processor
ios_xcconfig_targets_file_processor
launch
malformed_resource_exception
missing_required_fields_exception
new_file_string_processor
new_folder_processor
os
parser
processor
pubspec
queue_processor
replace_string_processor
runtime_file_string_processor
shell_processor
string_processor
unzip_file_processor
vscode_launch_file_processor
vscode_launch_processor