4. FUN & BYE BYE BOILERPLATE
• Diversão!!! =]
• Todas as vantagens do Scala sobre o Java
• Sintaxe limpa para o paradigma reativo funcional,
que requer funções de ordem superior
• Diminuir código “boilerplate” necessário no Android
5. FRP: JAVAVS. SCALA
EditText message = (EditText)findViewById(R.id.message);
final TextView charCount = (TextView)findViewById(R.id.char_count);
Events.text(message).subscribe(new Action1<String>() {
@Override
public void call(String str) {
charCount.setText(String.valueOf(str.length()));
}
});
val message = find[EditText](R.id.message)
val charCount = find[TextView](R.id.char_count)
Events.text(message).subscribe((str: String) =>
charCount.setText(str.length.toString))
Java
Scala
8. SBT
• Padrão para o Scala
• Convention over configuration
• Plugin maduro (02/2012) para Android:
• https://github.com/pfn/android-sdk-plugin
• Compatível com estrutura Ant ou Gradle
9. GRADLE + ANDROID
• Manter a estrutura exata do projeto Android
Studio
• Plugin muito novo (02/2014) para Scala
• https://github.com/saturday06/gradle-android-scala-plugin
• Não funcionou nos meus testes
10. CRIANDO UM PROJETO
• Conforme recomendação do android-sdk-plugin,
usamos IntelliJ, criamos uma aplicação Android
• Movemos o módulo app para a raiz
• Criamos o build.sbt e
project/plugings.sbt
• Apagamos os arquivos gradle*
11. build.sbt
// so we can use keywords from Android, such as 'Android' and 'proguardOptions'
import android.Keys._
import android.Dependencies.{apklib,aar}
!
android.Plugin.androidBuild
!
name := "Reactive"
!
platformTarget in Android := "android-19"
!
versionCode in Android := Some(7)
!
versionName in Android := Some(“1.0")
!
proguardOptions in Android ++= Seq(
"-dontobfuscate",
"-dontoptimize",
"-dontwarn android.**",
"-dontwarn com.android.**"
)
!
libraryDependencies ++= Seq(
"org.scaloid" %% "scaloid" % "3.2.1-8",
"com.android.support" % "appcompat-v7" % "19.1.0"
)
13. SCALOID
• Biblioteca para Android em Scala
• Facilitar a vida tirando bastante boilerplate
• Sugere a criação de layouts em Scala
• Eu não gosto desse approach, por enquanto
• Muitos implicits
14. SCALOID: EXEMPLOS
Button send = (Button)findViewById(R.id.send);
send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(SecondActivity.this, "Clique!", Toast.LENGTH_SHORT).show();
}
});
val send = find[Button](R.id.send)
send.onClick(toast("Clique!"))
Java sem Scaloid
Scala com Scaloid
15. SCALOID: LAYOUT
new SVerticalLayout {
STextView("Sign in").textSize(24.5 sp).<<.marginBottom(25 dip).>>
STextView("ID")
SEditText()
STextView("Password")
SEditText() inputType TEXT_PASSWORD
SButton("Sign in")
this += new SLinearLayout {
SButton("Help")
SButton("Sign up")
}
}.padding(20 dip)
16. MACROID
• Mesma ideia do layout em Scala
• Implementado com macros
• Ferramentas para ligar ao código da aplicação
• UI Actions, Tweaks etc…
• Melhor pensado que o Scaloid para interface
• Mesmo assim não tem feedback imediato na IDE
http://macroid.github.io/
17. MACROID: LAYOUT
l[LinearLayout](
// set button caption
w[Button] <~ text("Click me"),
!
// set text and hide for the time being
w[TextView] <~ text("Hello!") <~ hide
!
// set layout orientation
) <~ vertical
18. FRP FTW!
• Comportamento do app é escrito de maneira declarativa
• Ganhos tradicionais do paradigma funcional
• Ações processadas através de funções
• Estado intimamente ligado à UI
• Funções puras são mais fáceis de testar que objetos
19. FRAMEWORKS DE FRP
• RxJava + Scala
• https://github.com/Netflix/RxJava
• Java puro
• Funciona no Android sem Scala
• Baseado em stream de eventos
• Bindings para Scala
• Scala.Rx
• https://github.com/lihaoyi/scala.rx
• Scala puro
• Funciona em Scala.JS
• Baseado em valores
• Projeto de um homem só
20. FRP:APLICAÇÃO
• Tudo o que for assíncrono
• Eventos de UI
• Acesso serviços locais / remotos
• Quase tudo em um app…
22. DIFICULDADES
• Não consegui integrar o “run” do IntelliJ com o comando do SBT
• Sempre que alguma lib for trocada, é necessário rodar o sbt
gen-idea
• Problemas com o Proguard
• Ele é necessário inclusive em DEBUG
• Problemas de método / classe não encontrada ao rodar
requerem um sbt clean
25. TRABALHE COM SCALA
A Pinuts está contratando
Quer trabalhar com scala?
Fale comigo!
André Luiz Carvalho
andre@pinuts.com.br
@alcarv
RH da Pinuts
rh@pinuts.com.br