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

Join the Dart side of Web Development 2 ( Use the Force )

Join the Dart side of Web Development 2 ( Use the Forceย )

Talk about Dart, StageXL, Polymer.Dart, Force Framework @ Codemotion Rome 2015

Giovanni Laquidara

March 27, 2015
Tweet

More Decks by Giovanni Laquidara

Other Decks in Technology

Transcript

  1. Giovanni Laquidara Join the Dart Side of Web Development 2

    ( Use the Force ). [email protected] - Google Developer Group Roma Rome March 27th 2015
  2. MILAN november 28th/29th 2014 โ€“ Speaker's name require.js Backbone Backbone

    Marionette jQuery Modernizr moment.js dest templates
  3. MILAN november 28th/29th 2014 โ€“ Speaker's name require.js Backbone Backbone

    Marionette jQuery Modernizr moment.js dest templates PhantomJS
  4. MILAN november 28th/29th 2014 โ€“ Speaker's name require.js Backbone Backbone

    Marionette jQuery Modernizr moment.js dest templates PhantomJS Jasmine
  5. MILAN november 28th/29th 2014 โ€“ Speaker's name require.js Backbone Backbone

    Marionette jQuery Modernizr moment.js dest templates PhantomJS Jasmine Docs Docs Docs Docs Docs Docs Docs Docs Docs
  6. MILAN november 28th/29th 2014 โ€“ Speaker's name require.js Backbone Backbone

    Marionette jQuery Modernizr moment.js dest templates PhantomJS Jasmine Docs Docs Docs Docs Docs Docs Docs Docs Docs
  7. MILAN november 28th/29th 2014 โ€“ Speaker's name โ€ข Language โ€ข

    Libraries โ€ข Tools โ€ข Compilation to Javascript
  8. MILAN november 28th/29th 2014 โ€“ Speaker's name Dart is open

    source โ€ข BSD-style license โ€ข dart.googlecode.com โ€ข GitHub mirror โ€ข Contributing guide โ€ข ECMA Standard (TC52) โ€ข Production ready (1.9.1)
  9. MILAN november 28th/29th 2014 โ€“ Speaker's name import 'dart:math' show

    Random; // Import a class from a library. void main() { // The app starts executing here. print(new Dice(n: 12).roll()); // Print a new object's value. } class Dice { // Define a class. static Random shaker = new Random(); // Define a class variable. int sides, value; // Define instance variables. String toString() => '$value'; // Define a method using shorthand syntax. Dice({int n: 6}) { // Define a constructor. if (4 <= n && n <= 20) { sides = n; } else { throw new ArgumentError(/* */); // Support for errors and exceptions. } } int roll() { // Define an instance method. return value = shaker.nextInt(sides) + 1; // Get a random number. } }
  10. MILAN november 28th/29th 2014 โ€“ Speaker's name class Hug {

    num _strength; num get strength { // some code return this._strength; } set strength(num value) { // do something with value; this._strength = value; } }
  11. MILAN november 28th/29th 2014 โ€“ Speaker's name class Hug {

    num _strength; Hug(strength) { this._strength = strength; } Hug.light(strength) { this._strength = 0; } }
  12. MILAN november 28th/29th 2014 โ€“ Speaker's name class Hug {

    num _strength; Hug(this._strength); Hug operator +(Hug other) { return new Hug(strength + other.strength); } }
  13. MILAN november 28th/29th 2014 โ€“ Speaker's name var button =

    new ButtonElement(); button.id = 'fancy'; button.text = 'Click Point'; button.classes.add('important'); button.onClick.listen((e) => addTopHat()); parentElement.children.add(button);
  14. MILAN november 28th/29th 2014 โ€“ Speaker's name var button =

    new ButtonElement(); ..id = 'fancy'; ..text = 'Click Point'; ..classes.add(โ€˜important'); ..onClick.listen((e) => addTopHat()); parentElement.children.add(button);
  15. MILAN november 28th/29th 2014 โ€“ Speaker's name Missing getter? "Coffee".missing

    // ?? Class 'String' has no instance getter 'missing'. NoSuchMethodError : method not found: 'missing' Receiver: "Coffee" Arguments: []
  16. MILAN november 28th/29th 2014 โ€“ Speaker's name String compared to

    number? โ€œ2โ€ > 1 // ?? Unhandled exception: Class 'String' has no instance method '>'. NoSuchMethodError : method not found: '>' Receiver: "2" Arguments: [1]
  17. MILAN november 28th/29th 2014 โ€“ Speaker's name void main() {

    String name = "Giovanni Laquidara"; print(initials(name)); } String initials(String name) { StringBuffer retValue = new StringBuffer(); name.split(" ").forEach( (String part ) { retValue.write(part[0] + '.'); }); return retValue.toString(); }
  18. MILAN november 28th/29th 2014 โ€“ Speaker's name main() { var

    name = "Giovanni Laquidara"; print(initials(name)); } initials(name) { var retValue = new StringBuffer(); name.split(" ").forEach( ( part ) { retValue.write(part[0] + '.'); }); return retValue.toString(); }
  19. MILAN november 28th/29th 2014 โ€“ Speaker's name import 'dart:html'; InputElement

    toDoInput; UListElement toDoList; void main() { toDoInput = querySelector("#to-do-input"); toDoList = querySelector("#to-do-list"); toDoInput.onChange.listen(addToDoItem); } void addToDoItem(Event event) { LIElement newToDo = new LIElement(); newToDo.text = toDoInput.value; toDoInput.value = ''; toDoList.children.add(newToDo); }
  20. MILAN november 28th/29th 2014 โ€“ Speaker's name import 'dart:async' show

    Future, Completer; void main() { loadNews().then( (news) { //Do something with news }); print("Just print!"); } Future loadNews() { Completer completer = new Completer(); //Insert very slow process here completer.complete(); return completer.future; }
  21. MILAN november 28th/29th 2014 โ€“ Speaker's name import 'dart:io'; main()

    { HttpServer.bind(InternetAddress.LOOPBACK_IP_V4, 4040) .then((HttpServer server) { print('listening on localhost, port ${server.port}'); server.listen((HttpRequest request) { request.response.write('Hello, world!'); request.response.close(); }); }).catchError((e) => print(e.toString())); }
  22. MILAN november 28th/29th 2014 โ€“ Speaker's name name: gdghunt description:

    A application using google play game services version: 0.1.0 author: Giovanni Laquidara dependencies: googleapis: any googleapis_auth: any browser: any core_elements: ">=0.2.0 <0.3.0" polymer: ">=0.12.0 <0.13.0" paper_elements: ">=0.1.0 <0.2.0" pubspec.yaml
  23. MILAN november 28th/29th 2014 โ€“ Speaker's name main Library baz

    foo bar boo imports calls baz main foo bar Tree shaking dart2js The web is full of links, yet web dev has no linker
  24. MILAN november 28th/29th 2014 โ€“ Speaker's name <head> ... <link

    rel="import" href="packages/paper_elements/ paper_input.html"> ... </head> <body unresolved> <paper-input label="Type something..."></paper-input> ... <script type="application/dart">export 'package:polymer/ init.dart';</script> </body>
  25. MILAN november 28th/29th 2014 โ€“ Speaker's name <link rel="import" href="../packages/polymer/polymer.html">

    <polymer-element name="hello-world" noscript> <template> <p>Hello from inside a custom element!</p> </template> </polymer-element> Custom Element
  26. MILAN november 28th/29th 2014 โ€“ Speaker's name <polymer-element name="click-counter"> <template>

    <button on-click="{{increment}}">Click Me</button> <p>You clicked the button {{count}} times.</p> </template> <script type="application/dart" src="click_counter.dart"></ script> </polymer-element> Data binding
  27. MILAN november 28th/29th 2014 โ€“ Speaker's name import 'package:polymer/polymer.dart'; import

    'dart:html'; @CustomTag('click-counter') class ClickCounterElement extends PolymerElement { @observable int count = 0; ClickCounterElement.created() : super.created(); void increment(Event e, var detail, Node target) { count += 1; } } Data binding
  28. MILAN november 28th/29th 2014 โ€“ Speaker's name <polymer-element name="volume-nob"> <template>

    <p>You turned the volume to {{volume}}.</p> </template> <script type="application/dart" src="volume_nob.dart"></script> </polymer-element> Custom attributes <volume-nob volume="11"></volume-nob>
  29. MILAN november 28th/29th 2014 โ€“ Speaker's name Custom attributes import

    'package:polymer/polymer.dart'; import 'dart:html'; @CustomTag('volume-nob') class VolumeNobElement extends PolymerElement { // @published means 'this is an attribute', and it is observable. @published int volume = 0; VolumeNobElement.created() : super.created(); }
  30. MILAN november 28th/29th 2014 โ€“ Speaker's name Template conditional <polymer-element

    name="click-counter"> <template> <template if="{{count < 10}}"> ... </template> <template if="{{ count >= 10 }}"> ... </template> </template> <script type="application/dart" src="clickcounter.dart"></script> </polymer-element>
  31. MILAN november 28th/29th 2014 โ€“ Speaker's name Template loops <polymer-element

    name="fav-fruits"> <template> <ul> <template repeat="{{fruit in fruits}}"> <li> I like {{ fruit }}. </li> </template> </ul> </template> <script type="application/dart" src="fav_fruits.dart"></script> </polymer-element>
  32. MILAN november 28th/29th 2014 โ€“ Speaker's name Template loops import

    'package:polymer/polymer.dart'; @CustomTag('fav-fruits') class FavFruitsElement extends PolymerElement { final List fruits = toObservable(['apples', 'pears', 'bananas']); FavFruitsElement.created() : super.created(); }
  33. MILAN november 28th/29th 2014 โ€“ Speaker's name <polymer-element name="fancy-button" extends="button">

    <template> <style> :host { background: pink; } </style> <content></content> </template> <script type="application/dart" src="fancy_button.dart"></script> </polymer-element>
  34. MILAN november 28th/29th 2014 โ€“ Speaker's name import 'package:polymer/polymer.dart'; import

    'dart:html' show ButtonElement; @CustomTag('fancy-button') class FancyButton extends ButtonElement with Polymer, Observable { FancyButton.created() : super.created() { polymerCreated(); } }
  35. Use Familiar Annotations @Controller public class HelloWorldController { @RequestMapping("/helloWorld") public

    String helloWorld(Model model) { model.addAttribute("message", "Hello World!"); return "helloWorld"; } } @Controller class HelloWorldController { @RequestMapping("/helloWorld") String helloWorld(Model model) { model.addAttribute("message", "Hello World!"); return "helloWorld"; } }
  36. ForceServer fs = new ForceServer(host: โ€œ0.0.0.0", port: 3030, clientFiles: '../build/web/',

    clientServe: true); fs.start().then((_) { fs.send("request", {'whatIwant' : 'info'}); fs.on('info', (e, sendable) { sendable.send("received", { "data": "ok" }); }); });
  37. Pro๏ฌle management De๏ฌne pro๏ฌle send info to pro๏ฌle var profileInfo

    = { 'name': playName }; forceClient.initProfileInfo(profileInfo); sendable.sendToProfile('name', name, 'private', message);
  38. Authentication forceServer.on("examplerequest", (e, sendable) { // do something }, roles:

    ["ADMIN", "BASIC"]); class SessionStrategy extends SecurityStrategy { bool checkAuthorization(HttpRequest req) { HttpSession session = req.session; return (session["user"]!=null); } Uri getRedirectUri(HttpRequest req) { var referer = req.uri.toString(); return Uri.parse("/login/?referer=$referer"); } } forceServer.server.strategy = new SessionStrategy();
  39. mySprite.addEventListener(Event.ENTER_FRAME, enterFrameListener); mySprite.addEventListener(MouseEvent.CLICK, mouseClickListener, useCapture:true); var subscription1 = mySprite.onEnterFrame.listen(enterFrameListener); var

    subscription2 = mySprite.onMouseClick.listen(mouseClickListener); var subscription3 = mySprite.on("customEvent").listen(customEventListener); //... subscription1.cancel(); // equals removeEventListener(...) subscription2.pause(); // pause receiving events subscription2.resume(); // resume receiving events
  40. var textField = new TextField(); textField.defaultTextFormat = new TextFormat('Spicy Rice',

    30, Color.Black); textField.text = 'The quick brown fox jumps over the lazy dog.' textField.x = 20; textField.y = 20; textField.width = 100; textField.height = 50; textField.wordWrap = true; addChild(textField);
  41. var resourceManager = new ResourceManager() ..addBitmapData('dog', 'images/dog.png') ..addSound('plop', 'sounds/plop.mp3') ..addTextureAtlas('fl',

    'images/flowers.json', TextureAtlasFormat.JSONARRAY); resourceManager.load().then((result) { var dog = resourceManager.getBitmapData('dog'); var plop = resourceManager.getSound('plop'); var flowers = resourceManager.getTextureAtlas('fl'); var daisy = flowers.getBitmapData('daisy'); });
  42. MILAN november 28th/29th 2014 โ€“ Speaker's name // The ResourceManager

    substitutes embedded resources of Flash. var resourceManager = new ResourceManager(); resourceManager.addSound("plop", "sounds/plop.mp3"); // loads ogg-file in Firefox! ... var sound = resourceManager.getSound("plop"); var soundTransform = new SoundTransform(0.5); var soundChannel = sound.play(false, soundTransform);
  43. var tween = new Tween(sprite, 2.0, TransitionFunction.easeOutBounce); tween.animate.x.to(700); tween.animate.y.to(500); tween.delay

    = 1.0; tween.onComplete = () => sprite.removeFromParent(); renderLoop.juggler.add(tween);
  44. MILAN november 28th/29th 2014 โ€“ Speaker's name Giovanni Laquidara +GiovanniLaquidara

    @joaolaq joaobiriba thanks() => new FeedBack(); getQuestions().then( (what) { answer(what); }); https://joind.in/talk/view/14108