Slide 1

Slide 1 text

Introdução ao Kotlin Flow Armando Picón Senior Android Developer at Cornershop Inc. @devpicon https://linktr.ee/devpicon

Slide 2

Slide 2 text

O que é um Flow? • Para começar os fluxos do Kotlin Flow vão ser utilizados para aquelas situações onde é preciso fazer o retorno dos múltiplos valores processados assincronamente • O Kotlin Flow está baseado em frameworks reativos como RxJava • Cada um dos fluxos vai precisar de alguém para coletar (recolher) pelos resultados, é por isso que a diferença dos Kotlin Channels, estes são frios (cold)

Slide 3

Slide 3 text

Emitter Collector

Slide 4

Slide 4 text

Emitter Collector flow{ emit() } collect()

Slide 5

Slide 5 text

Emitter Collector flow{ emit() } collect() Flow builder

Slide 6

Slide 6 text

Flow builders • flow{} -> o builder mais básico, vai te ajudar a criar um fluxo ou flow desde um bloco do código que pode ser suspenso • flowOf() -> vai estabelecer um fluxo com um conjunto fixo de dados • .asFlow() -> é uma extension function para criar um fluxo desde uma coleção de dados

Slide 7

Slide 7 text

flow{ emit() } collect() Flow builder Emitter Collector

Slide 8

Slide 8 text

flow{ emit() } collect() map{} filter{} transform{} take() Flow builder Emitter Collector

Slide 9

Slide 9 text

flow{ emit() } collect() intermediate operators map{} filter{} transform{} take() Flow builder Emitter Collector

Slide 10

Slide 10 text

Operadores intermediários Intermediate flow operators • map{} -> vai retornar um fluxo com o resultado de aplicar uma função para transformar cada um dos valores do fluxo • filter{} -> vai retornar um fluxo com só os dados que coincidem com uma condição definida • transform{} -> vai permitir fazer transformações simples e complexas. Podemos emitir valores por uma quantidade de vezes • take() -> vai finalizar a execução do fluxo quando o limite seja alcançado

Slide 11

Slide 11 text

flow{ emit() } collect() map{} filter{} transform{} take() Flow builder operadores intermedios Emitter Collector

Slide 12

Slide 12 text

flow{ emit() } collect() Terminal flow operator map{} filter{} transform{} take() Flow builder operadores intermedios Emitter Collector

Slide 13

Slide 13 text

Operadores terminais (Terminal flow operators) • collect{} -> vai coletar o fluxo com uma ação provida • reduce{} -> vai acumular os dados começando com o dado primeiro e aplicando o operador definido. Vai lançar um NoSuchElementException se o fluxo estiver vazio • fold{} -> muito similar ao “reduce”, mas com uma diferença, este vai começar com um dado inicial provido São funções suspensas que vão começar a coleta dos dados do fluxo

Slide 14

Slide 14 text

Operadores terminais (Terminal flow operators) • first{} -> aquele retorna o primeiro elemento emitido pelo fluxo e depois cancela o fluxo. Lança uma "NoSuchElementException" se o fluxo estiver vazio • single{} -> aquele espera por apenas um valor para ser publicado. Lança uma NoSuchElementException para um fluxo vazio e uma IllegalStateException se o fluxo contiver mais de um elemento São funções suspensas que vão começar a coleta dos dados do fluxo

Slide 15

Slide 15 text

Operadores terminais (Terminal flow operators) • toList(), toSet() -> coletam os valores do fluxo e os converte em uma coleção São funções suspensas que vão começar a coleta dos dados do fluxo

Slide 16

Slide 16 text

Operadores terminais (Terminal flow operators) • toList(), toSet() -> coletam os valores do fluxo e os converte em uma coleção • asLiveData() -> coletam os valores do fluxo e os converte em um livedata São funções suspensas que vão começar a coleta dos dados do fluxo androidx.lifecycle:lifecycle-livedata-ktx

Slide 17

Slide 17 text

Preservação do contexto (Context preservation) • As coleções sempre acontecem no contexto da corotina que chamou o fluxo • Você não pode mudar do contexto quando uma coleção está em execução. • Fazendo uso do operador flowOn() é a única maneira possível para mudar o contexto da execução

Slide 18

Slide 18 text

Os fluxos são sequenciais (Flows are sequential) • Se cada coleta de um fluxo é realizada sequencialmente, o que acontece se a coleta e emissão forem lentas?

Slide 19

Slide 19 text

Emitter Collector delay(100) emit delay(100) println(it) delay(100) emit delay(100)

Slide 20

Slide 20 text

A execução sequencial pode ser um problema? (Could be the sequential execution an issue?) • A execução sequencial pode ser um problema potencial quando o emissor e o coletor precisaram de muito tempo para completar suas tarefas • É importante lembrar que os fluxos são executados no contexto da mesma corotina

Slide 21

Slide 21 text

Os desafios para desacoplar o emissor e coletor (Challenges to decouple the emitter and the collector) • Executar o emissor em uma corotina separada pode fazer com que os dois se tornem simultâneos • Com duas corotinas separadas, precisaríamos de alguns meios de comunicação para conectá-los • Os canais (channels) proporcionam um mecanismo onde podemos enviar um elemento de um transmissor e recebê-lo em outro ponto através de um canal

Slide 22

Slide 22 text

Só para lembrar... ...os canais são quentes e faz possível ter um buffer

Slide 23

Slide 23 text

Operador Buffer (Buffer operator) • O uso de um buffer permite tratar esta situação, através de um canal é possível acumular e consumir os elementos à medida que são gerados. • O operador buffer cria uma corotina separada durante a execução do fluxo

Slide 24

Slide 24 text

Emitter Collector delay(100) emit delay(100) println(it) delay(100) emit delay(100) println(it) delay(100) emit

Slide 25

Slide 25 text

Transparência das exceções (Exception transparency) • As exceções podem ser relançadas • Exceções também podem ser lançadas desde o bloco catch{} • As exceções podem ser ignoradas ou processadas por algum outro código

Slide 26

Slide 26 text

Show me some code dude! https://github.com/DevPicon/kotlin-marvel-hero-finder

Slide 27

Slide 27 text

Referencias • Asynchronous Flow https://kotlinlang.org/docs/reference/coroutines/flow.html • Cold flows, hot channels https://medium.com/@elizarov/cold-flows-hot-channels-d74769805f9 • Simple design of Kotlin Flow https://medium.com/@elizarov/simple-design-of-kotlin-flow-4725e7398c4c • Kotlin Flows and Coroutines https://medium.com/@elizarov/kotlin-flows-and-coroutines-256260fb3bdb

Slide 28

Slide 28 text

Leitura recomendada • Asynchronous development in Android: RxJava vs Kotlin Flow https://medium.com/makingtuenti/asynchronous-development-in-android-rxja va-vs-kotlin-flow-f7fdf2e2f81b • From RxJava 2 to Kotlin Flow: Threading https://proandroiddev.com/from-rxjava-2-to-kotlin-flow-threading-8618867e1 955 • The Real Kotlin Flow benefits over RxJava https://proandroiddev.com/the-real-kotlin-flow-benefits-over-rxjava-c19b99ba 6eb9

Slide 29

Slide 29 text

Codalot Podcast anchor.fm/codalot youtube.com/devpicon Obrigado! /devpicon