iakta.org
en
27 Aprile 2018 | 4 min. ( 848 parole ) | di Salvatore Giordano

Flavoring Flutter

Se avete letto il mio ultimo articolo su Flutter saprete cha abbiamo avuto dei problemi con la configurazione dei flavor.
flutter ios android cross-platform

Se avete letto il mio ultimo articolo su Flutter saprete cha abbiamo avuto dei problemi con la configurazione dei flavor.

Perchè usare i flavor

Lavorando per hobby come sviluppatore Android non ho mai dato importanza ai flavors/build-config. Non ne avevo bisogno, ero l’unica persona del mio team e l’unico cliente ¯\(ツ)/¯

Qui in Iakta il team è più grande e abbiamo molti clienti, quindi se qualcosa va storto non basta urlarti allo specchio.

me angry with me

I flavors sono semplicemente comodi. Ti permettono di definire delle configurazioni di build e switcharle a piacimento. Ad esempio potresti avere un flavor per lo sviluppo, e uno per la produzione. Potresti impostare un URL diverso per le chiamate API o icone e nomi diversi. Con un clic sei pronto per sviluppare o rilasciare la tua fantastica applicazione.

Utilizziamo molte configurazioni di flavor, non solo per la comodità, ma anche per essere sicuri di implementare la versione corretta dell’app. Solitamente impostiamo icone diverse e, a volte, persino il tema dell’app per essere sicuri di non rilasciare un’app con un URL API che punta a macchine locali o di gestione temporanea. Sarebbe molto pericoloso e vergognoso.

me ashamed

Di solito utilizziamo da 3 a 5 flavor diversi per app (sviluppo, produzione, staging, demo ..)

Flavors in Flutter

Quando si parla di Flutter, i flavors sono facili da implementare, ma se non conosci i flavor in Android e gli schema in iOS puoi avere qualche problema. Ho spesso usato i buildConfigs in Android e i target in iOS e quindi non è stato così semplice.

Flutter da linea di comando ha un’opzione per i flavor, quindi puoi eseguire/compilare la tua app utilizzando i flavor:

flutter build --flavor development

These are mapped to android productFlavors and iOS schema.
Questi sono mappati sui productflavors in android e gli schema in ios.

Android productFlavors

Per quanto riguarda Android, i productflavors sono definiti nel modulo gradle dell’app.

Android gradle configuration

Come potete vedere, è piuttosto semplice e puoi impostare diversi application id suffix.

Nota che i nomi dei flavor devono essere gli stessi del comando cli di flutter.

Adesso ad esempio è possibile aggiungere icone basate sul tipo di sapore.

Adding image asset

Select the flavor you need

Two different app version intalled at the same time

iOS schema

In iOS è un po ‘più complicato.

Dopo un po ‘di tempo penso che questo sia il modo più semplice per farlo.

Crea nella cartella ios/Flutter un file di configurazione per ogni flavor, includi il file Generated.xcconfig e setta FLUTTER_TARGET sul file principale richiesto dalla destinazione.

A xcconfig file example

//
//  development.xcconfig
//  Runner
//
//  Created by Salvatore on 26/04/18.
//  Copyright © 2018 The Chromium Authors. All rights reserved.
//

#include "Generated.xcconfig"

FLUTTER_TARGET=lib/main-dev.dart

server_url = www.iatka.it/api/dev
server_port = 8080
protocol = http

Qui puoi anche definire alcune variabili d’ambiente di cui puoi avere bisogno nel tuo codice iOS. Ad esempio qualche url.

Quindi crea un nuovo schema per ogni flavor.

Create a new scheme

Ricordati di spuntare la casella di controllo shared nella finestra di dialogo.

Very important

Ora seleziona il progetto Runner e aggiungi le configurazioni di cui hai bisogno.

Adding the configurations

Si noti che è necessario disporre di due configurazioni per ciascun flavor denominato con Release-[flavorName] e Debug-[flavorName]. I nomi sono molto importanti per motivi di abbinamento.

È anche necessario un file plist per ogni flavor per impostare cose come bundleId o la variabile definita nel file xcconfig.

An example of plist file

Per collegare i file Plist alle configurazioni, andate sul target Runner

Linking plist files

Per quanto riguarda le icone, possono essere impostate nella destinazione Runner nell’opzione Asset Catalog App Icon Set Name.

Setting icons

Fatto!

Flavors in dart

Come usare i flavor in dart? Non c’è modo di ottenere il flavor nel codice flutter.

Abbiamo trovato che l’unico modo per risolvere questo problema è usare i target Flutter.

Quando esegui la tua app, puoi scegliere il file main usando l’opzione cli -t (o -target):

flutter build --flavor development -t lib/main-dev.dart

In questo modo il punto di ingresso dell’app è impostato su main-dev.dart.

Come sfruttare questo comando? La cosa più semplice è creare un file config.dart con una classe Config e un enum di Flavor.

enum Flavor {
  DEVELOPMENT,
  RELEASE,
}

class Config {

  static Flavor appFlavor;
}

Utilizzando il campo statico appFlavor siamo in grado di impostare diversi flavor in diversi file main.

main-dev.dart

import 'package:flutter/material.dart';
import 'package:flutter_flavors/appEntry.dart';
import 'package:flutter_flavors/config.dart';

void main() {
  Config.appFlavor = Flavor.DEVELOPMENT;
  runApp(new MyApp());
}

In questo modo è facile sapere se siamo nella versione di sviluppo o di produzione.

import 'package:flutter/material.dart';

enum Flavor {
  DEVELOPMENT,
  RELEASE,
}

class Config {

  static Flavor appFlavor;

  static String get helloMessage {
    switch (appFlavor) {
      case Flavor.RELEASE:
        return 'RELEASE';
      case Flavor.DEVELOPMENT:
      default:
        return 'DEVELOPMENT';
    }
  }

  static Icon get helloIcon {
    switch (appFlavor) {
      case Flavor.RELEASE:
        return new Icon(Icons.new_releases);
      case Flavor.DEVELOPMENT:
      default:
        return new Icon(Icons.developer_mode);
    }
  }
}

Ad esempio qui possiamo mostrare diversi messaggi e icone in base al tipo di flavor!

Final configuration

Quindi questa sarebbe la nostra configurazione finale: due file principali e un file di configurazione.

Development version

Production version

Hooray!

Considerazioni finali

Si, lo so. È un casino, ma è una cosa “una tantum” che può farti risparmiare tempo e fatica.

È possibile trovare il repository di esempio all’indirizzo https://github.com/iakta/flutter_flavors.
Se ho fatto qualcosa di sbagliato o mi sono perso qualcosa, scrivimi. Commenti e considerazioni sono più che benvenuti!

flutter ios android cross-platform
Twitter Facebook Google+

Debug PHP da riga di comando o app

…

Privacy Policy © 2017 Iakta srl Published with Hugo and Cockpit CMS using Hugocockpit Theme based on Bleak by zutrinken
Menu
    • Perchè usare i flavor
    • Flavors in Flutter
      • Android productFlavors
      • iOS schema
      • Flavors in dart
    • Considerazioni finali