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

Introdução ao Kotlin Flow

Introdução ao Kotlin Flow

Uma apresentação que brindei para a comunidade Kotlin São Paulo onde falamos acerca dos fluxos que podem ser criados com o Kotlin Flow.
Você vai encontrar o video desta palestra em: https://www.youtube.com/watch?v=DzxVVD6WAnE

Avatar for Armando Picón

Armando Picón

August 27, 2020
Tweet

More Decks by Armando Picón

Other Decks in Programming

Transcript

  1. Introdução ao Kotlin Flow Armando Picón Senior Android Developer at

    Cornershop Inc. @devpicon https://linktr.ee/devpicon
  2. 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)
  3. 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
  4. 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
  5. flow{ emit() } collect() Terminal flow operator map{} filter{} transform{}

    take() Flow builder operadores intermedios Emitter Collector
  6. 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
  7. 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
  8. 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
  9. 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
  10. 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
  11. 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?
  12. 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
  13. 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
  14. 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
  15. 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
  16. 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
  17. 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