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

Microapps e Flutter: Escalando o desenvolviment...

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.

Microapps e Flutter: Escalando o desenvolvimento mobile

Avatar for Vinícius Oliveira

Vinícius Oliveira

January 29, 2022
Tweet

More Decks by Vinícius Oliveira

Other Decks in Programming

Transcript

  1. Cenário 3 CENÁRIO - Dois apps que resolvem o mesmo

    problem a - Stacks diferente s - Times distinto s - Duas bases de códig o - Feature não é compartilhada Representante Eudora Revendedor O Boticário
  2. Arquitetura de microapps 6 ARQUITETURA DE MICROAPPS - Modula r

    - Agnóstica a marc a - Testabilidad e - Manutençã o - Autonomia squad s - Feature disponível em todos app s - Produtividade
  3. IMG App 9 ARQUITETURA DE MICROAPPS class EudoraApp extends MainModule

    { @override List<Bind> get binds => [ Bind((_) => EudoraBloc()), ... ]; @override List<ModularRouter> get routers => [ ModularRouter('/login', module: LoginMicroApp()), ... ]; @override Widget get bootstrap => EudoraWidget(); }
  4. Microapp 10 ARQUITETURA DE MICROAPPS class LoginMicroApp extends ChildModule {

    @override List<Bind> get binds { final authenticationRepository = AuthRepositoryImpl(); return [ Bind((i) => AuthBloc(authenticationRepository: authenticationRepository)), Bind((i) => ForgotPasswordBloc()) ]; } @override List<ModularRouter> get routers => [ ModularRouter('/login', child: (_, args) => LoginPage()), ModularRouter('/forgot_password', child: (_, args) => ForgotPasswordPage()), ]; static Inject get to => Inject<LoginMicroApp>.of(); }
  5. IMG Theme 14 DESIGN SYSTEM class EudoraTheme implements Theme {

    @override FontFamily fontFamily() { return FontFamily(primary: 'MyriadPro', secondary: 'OpenSans'); } @override ThemeColor color() { return ThemeColor( appBackground: Color(0xfff6f6f6), brandPrimary: Color(0xff472d75), ...); } @override FontSize fontSize() { return FontSize( bodyMedium: 3.5 * baseValue, auxiliarSmall: 3 * baseValue, ...); } @override BorderWidth borderWidth() {...} @override CornerRadius cornerRadius() {...} @override Margin margin() {...} @override Padding padding() {...} }
  6. IMG Unitários 16 TESTES blocTest( 'should emit [PaymentLoadInProgress, PaymentLoadSuccess] when

    PaymentStarted is added', build: () => paymentBloc, act: (paymentBloc) { when(basketClient.getOrderPayment()) .thenAnswer((_) => Future.value(orderPayment)); paymentBloc.add(PaymentStarted()); }, expect: [ PaymentLoadInProgress(), PaymentLoadSuccess( paymentPlans: filteredPayments, total: orderPayment.total, subtotal: orderPayment.subtotal, ) ], );
  7. IMG Widgets 17 TESTES testWidgets('should call bloc event when button

    is clicked', (tester) async { await tester.pumpWidget(_buildApp()); await tester.pumpAndSettle(); await tester.tap(find.text(Strings.buttonGetPassword)); await tester.pumpAndSettle(); verify(forgotPasswordBloc.add(ForgotPasswordRequested(email: ''))) .called(1); });
  8. IMG Integração 18 TESTES test('should return ProductResponse when search', ()

    async { final term = 'term'; final page = 1; final pageSize = 20; final expectedResponse = ProductSearchResponseExpected() final mockResponse = MockResponse() ..httpCode = 200 ..body = await 'product_search_response.json'.read() ..headers = {'content-type': 'application/json; charset=utf-8'}; mockWebServer.enqueueResponse(mockResponse); final response = await searchDataProvider.search(term, page, pageSize); final request = mockWebServer.takeRequest(); expect(request.uri.path, '/search/products'); expect(request.method, 'GET'); expect(expectedResponse, response); });
  9. IMG CI/CD 20 CI/CD - Monorep o - Bitris e

    - fastlan e - dartanalyze r - Danger