Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Microapps e Flutter: Escalando o desenvolviment...
Search
Vinícius Oliveira
January 29, 2022
Programming
510
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Microapps e Flutter: Escalando o desenvolvimento mobile
Vinícius Oliveira
January 29, 2022
More Decks by Vinícius Oliveira
See All by Vinícius Oliveira
Evolução da Arquitetura do Magalu e os Desafios da Modularização
viniciusmo
0
68
Construindo SDKs móveis escaláveis (KMM + Clean Architecture) - caso de uso unicoIDTech
viniciusmo
0
63
Flutter Brasil - Caso de Uso Unico 2022
viniciusmo
0
82
CODECON - Design System - Genoma
viniciusmo
0
88
Estendendo seu app com Flutter
viniciusmo
0
160
Miniapps Magalu: Transformando um Super App em um SO
viniciusmo
0
470
Mobile Platform Teams: Como construímos e entregamos SDK`s escaláveis com qualidade.
viniciusmo
0
140
Treinando um modelo com AutoML Vision Edge
viniciusmo
0
120
Other Decks in Programming
See All in Programming
コードレビューのボトルネックを"する側"と"される側"の両面から解消する
yub0n
2
1.5k
SREの越境 / SRE Collaboration
y0hgi
2
300
Jetpack Compose Mechanisms
skydoves
2
550
When benchmarks go bad - what I learned from measuring performance wrong
hollycummins
0
180
APNsからLive Activityを開始する話
yumnumm
0
150
速く作れる。その次は、速く確かめられる開発へ 〜AIネイティブ開発を支える、Shift Down〜 / Can build fast. Next, moving to development where we can verify fast.
rkaga
8
5.6k
UnityでSystem.Net.WebSocketsなWebSocketサーバが動かないのでUnity Monoのコードを覗いてみた / about implementing websocket server with unity mono
drumath2237
1
560
モジュールの視点からSwiftを読み解く #iosdc
s_shimotori
0
360
難しいけど、読めた。- OSSの入口に立った話。
sts11142
0
140
JRuby: Past, Present, and Future
headius
0
220
Are APIs Still Relevant in the AI Era?
soyuka
0
430
月間100万人のサービス刷新で、 技術選定をHonoに振り切った話
yutobara
2
3.7k
Featured
See All Featured
A designer walks into a library…
pauljervisheath
211
25k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.6k
The browser strikes back
jonoalderson
0
1.8k
How to train your dragon (web standard)
notwaldorf
96
6.9k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.2k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
3k
Designing for Timeless Needs
cassininazir
1
520
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6.1k
Bootstrapping a Software Product
garrettdimon
PRO
306
120k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.5k
Accessibility Awareness
sabderemane
1
240
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
50
10k
Transcript
Microapps e Flutter: Escalando o desenvolvimento mobile MOBILE Vinícius Moisés
Tech Lead Rodrigo Plácido Tech Lead
Grupo Boticário 2 GRUPO BOTICÁRIO Representante Eudora Revendedor O Boticário
O Boticário Minha Revenda Digital Beleza na Web
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
Como escalar?
Flutter 5 FLUTTER - Performanc e - Integração com código
nativ o - Movimento de mercado
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
7 ARQUITETURA DE MICROAPPS
IMG Microapp 8 ARQUITETURA DE MICROAPPS
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(); }
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(); }
Design System
IMG Design System 12 DESIGN SYSTEM - Agnóstico a marc
a - Baseado em temas
IMG Microapp Login 13 DESIGN SYSTEM
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() {...} }
Testes
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, ) ], );
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); });
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); });
CI/CD
IMG CI/CD 20 CI/CD - Monorep o - Bitris e
- fastlan e - dartanalyze r - Danger
Obrigadx! MOBILE