Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Estendendo seu app com Flutter

Estendendo seu app com Flutter

Avatar for Vinícius Oliveira

Vinícius Oliveira

January 30, 2022
Tweet

More Decks by Vinícius Oliveira

Other Decks in Programming

Transcript

  1. _O GRUPO BOTICÁRIO 10 ENTRE OS MAIORES VAREJISTA S DO

    BRASIL PONTOS DE VEND A MULTIMARCA 3 5 mil PRESENTES EM cidades em todo o Brasi l e em mais de 15 países 99.9% ELEITO EM 2019 maio r franqui a em nº lojas 2 FÁBRICAS 5 C D ´ S 5 ES CRITÓ RI OS S. J. dos Pinhais - PR Camaçari - BA Registro - SP Jaguaré - S P Serra - ES S. Gonçalo dos Campos - BA Varginha - MG Curitiba São Paulo Portugal Colômbia China SOMOS O maio r e-commerc e de belez a do Brasil
  2. Cenário 5 CENÁRIO EUDORA DESIGN SYSTEM Shared 2 microapps LOGIN

    CARRINHO PEDIDOS shared Novo app (casca) Shared 3 Shared 4 Shared 5 Shared 6 LEGADO APP RE BOTICÁRIO APP RE BOTICÁRIO NOVO MICROAPP Integração RN + Flutter LEGADO APP RE EUDORA APP RE Eudora
  3. Integração 7 INTEGRAÇÃO React Native JS Android iOS Novo Microapp

    Kotlin / Java Android Native Modules iOS Native Modules Swift / Objective- C Flutter Module
  4. Integrando RN + Android + Flutter 8 INTEGRAÇÃO - Integrando

    o seu código RN com Android public class NavigatorModule extends ReactContextBaseJavaModule { @NonNull @Override public String getName() { return "NavigatorModule"; } @ReactMethod public void navigate(String parameter, Callback callback) { ... } }
  5. Integrando RN + Android + Flutter 9 INTEGRAÇÃO - Adicionar

    módulo como dependência via gradle include ':app' setBinding(new Binding([gradle: this])) evaluate(new File( settingsDir.parentFile, '../mrd-microapp-signup-mobile/.android/include_flutter.groovy' )) include ':mrd-microapp-signup-mobile' project(':mrd-microapp-signup-mobile').projectDir = new File('../mrd-microapp-signup- mobile')
  6. Integrando RN + Android + Flutter 10 INTEGRAÇÃO - Adicionar

    FlutterActivity no AndroidManifest.xml <activity android:name="io.flutter.embedding.android.FlutterActivity" android:theme="@style/AppTheme" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:hardwareAccelerated="true" android:windowSoftInputMode="adjustResize"/>
  7. Integrando RN + Android + Flutter 11 INTEGRAÇÃO - Iniciar

    a Flutter Engine public class App extends Application { ... @Override public void onCreate() { super.onCreate(); flutterEngine = new FlutterEngine(this); flutterEngine.getDartExecutor().executeDartEntrypoint( DartEntrypoint.createDefault() ); FlutterEngineCache .getInstance() .put("flutter_engine", flutterEngine); } 
 }
  8. Integrando RN + Android + Flutter 12 INTEGRAÇÃO - Chamar

    módulo Flutter getCurrentActivity().startActivity( FlutterActivity.withCachedEngine(FLUTTER_ENGINE_ID) .build(reactContext) );
  9. Integrando RN + iOS + Flutter 13 INTEGRAÇÃO - Integrando

    o seu código RN com iOS #import "NavigatorModule.h" #import "AppDelegate.h" @import Flutter; @implementation NavigatorModule RCT_EXPORT_MODULE(); RCT_EXPORT_METHOD(navigate:(NSString *)parameter callback:(RCTResponseSenderBlock)callback) { //código para realizar a navegação } @end
  10. Integrando RN + iOS + Flutter 14 INTEGRAÇÃO - Adicionar

    dependência do módulo via CocoaPods #Podfile flutter_application_path = '../mrd-microapp-signup-mobile' load File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb') target 'App' do ... install_all_flutter_pods(flutter_application_path) end
  11. Integrando RN + iOS + Flutter 15 INTEGRAÇÃO - Iniciar

    a Flutter Engine #import <FlutterPluginRegistrant/GeneratedPluginRegistrant.h> #import "AppDelegate.h" @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary<UIApplicationLaunchOptionsKey, id> *)launchOptions { ... self.flutterEngine = [[FlutterEngine alloc] initWithName:@"flutter_engine"]; [self.flutterEngine run]; [GeneratedPluginRegistrant registerWithRegistry:self.flutterEngine]; return [super application:application didFinishLaunchingWithOptions:launchOptions]; } @end
  12. Integrando RN + iOS + Flutter 16 INTEGRAÇÃO - Chamar

    módulo Flutter ... dispatch_async(dispatch_get_main_queue(), ^(void) { FlutterEngine *flutterEngine = ((AppDelegate *)UIApplication.sharedApplication.delegate).flutterEngine; FlutterViewController *flutterViewController = [[FlutterViewController alloc] initWithEngine:flutterEngine nibName:nil bundle:nil]; AppDelegate * delegate = (AppDelegate *)UIApplication.sharedApplication.delegate; [[delegate topViewController] presentViewController:flutterViewController animated:YES completion:nil]; }); ...
  13. Passando parâmetros RN → Flutter 18 PASSANDO PARÂMETROS RN →

    FLUTTER React Native JS Android/iOS Novo Microapp JSON+Native Modules JSON+Flutter Channel
  14. Passando parâmetros RN → Flutter 19 PASSANDO PARÂMETROS RN →

    FLUTTER #import "NavigatorModule.h" @import Flutter; @implementation NavigatorModule RCT_EXPORT_MODULE(); RCT_EXPORT_METHOD(navigate:(NSString *)parameter callback:(RCTResponseSenderBlock)callback) { dispatch_async(dispatch_get_main_queue(), ^(void) { .., FlutterMethodChannel * channel = [FlutterMethodChannel methodChannelWithName:@"NavigatorChannel" binaryMessenger:flutterViewController.binaryMessenger]; [channel invokeMethod:@"navigatorData" arguments:parameter]; ... }); } @end
  15. Passando parâmetros RN → Flutter 20 PASSANDO PARÂMETROS RN →

    FLUTTER public class NavigatorModule extends ReactContextBaseJavaModule { private ReactApplicationContext reactContext; private MethodChannel methodChannel = new MethodChannel( MainApplication.flutterEngine.getDartExecutor().getBinaryMessenger(), "NavigatorChannel"); NavigatorModule(ReactApplicationContext context) { super(context); reactContext = context; } @NonNull @Override public String getName() { return "NavigatorModule"; } @ReactMethod public void navigate(String parameter, Callback redirectToOrderCallback) { getCurrentActivity().startActivity( FlutterActivity.withCachedEngine(FLUTTER_ENGINE_ID) .build(reactContext) ); getCurrentActivity().runOnUiThread(new Runnable() { @Override public void run() { methodChannel.invokeMethod("navigatorData", parameter); } }); } }
  16. Recebendo os parâmetros no Flutter 21 PASSANDO PARÂMETROS RN →

    FLUTTER ... 
 final methodChannel = MethodChannel('NavigatorChannel'); void init() { methodChannel.setMethodCallHandler(receiveFromHost); } static Future<void> receiveFromHost(MethodCall call) async { if (call.method == 'navigatorData') { final String json = call.arguments; //realizar transformações } } ...
  17. Vantagens 25 VANTAGENS - Somente uma versão em produção -

    Fácil compartilhamento de código - Produtividade
  18. Considerações Finais 27 CONSIDERAÇÕES FINAIS - Tamanho do app -

    Conhecimento em plataformas nativas - Fluxos distintos