Act 1: Inspiration
August 2013: Bravo
Universal app that fetched pure JavaScript code from a URL
Ran directly against OpenGL and networking APIs
Self-hosted framework in JavaScript
Example Bravo apps
Started a DOM-like framework in CoffeeScript but never published
2013-2014: Talking to web customers
Act 2: Experimentation & Creation
September 2014: Razor
October & November 2014: Open the Sky
commit 00882d626a478a3ce391b736234a768b762c853a
Author: Adam Barth <abarth@chromium.org>
Date: Thu Oct 23 11:15:41 2014 -0700
Open the Sky
Still Blink/Razor, still .sky files, lots of code deletion.
Sky Spinning Square
Turned on all the JS bells and whistles we could.
December 2014: Sky framework
commit be756e732950978364b240ea3aafd53a88f53e98
Author: Eric Seidel <eseidel@chromium.org>
Date: Thu Dec 18 13:01:43 2014 -0800
Add super-basic sky widgets.
sky-element.sky
XHTMLRequest.sky
January 2015: Still leaning very heavily on Blink legacy
sky-input.sky
<div id="control" contenteditable on-keydown="handleKeyDown">{{ value }}</div>
Even this early, cracks the approach:
handleKeyDown(event) {
// TODO(abarth): You can still get newlines if the user pastes them.
if (event.keyCode == 0xD)
event.preventDefault();
}
January 2015: SkyShell
Add a standalone SkyShell.apk for testing
This CL adds a SkyShell.apk, which will become a direct embedding of Sky on Android that will let us run performance tests on the Sky engine in a self-contained environment on a real device.
SkyShell was a universal app that loaded Sky apps over the network. We did all our development and demos on a live server.
Act 3: Finding Flutter
February 2015: Leaving JavaScript-land
We were iterating very quickly, but was JavaScript tied to web ecosystem
Lots of positive talk—no code lands:
Considered many other languages, picked Dart—code lands:
February 2015: Dart: 2++ = 3
Feb 1: sky_use_dart
Feb 12: Merge SkyDart branch
Feb 23: Stocks app
March 2015: Effen
Effen reactive framework experiment for Sky
Rafael starts working on a reactive framework:
class MyComp extends Component {
Node render() {
return new Container(
onClick: onClick,
onScrollStart: _handleScroll // direct handler
);
}
}
… in the “examples” directory
March 2015: Shake to reload
Still running everything from a live server
Development process involves shake to reload
Caused SkyShell to reload the app from the dev server
March 2015: Effen & Getting to carry
April 2015: Dart Summit, Hello Sky!
May 2015: Goodbye DOM, Hello Canvas API
June 2015: Scaling up
JIT Jank
State confusion bugs in fn2
September 2015: fn3
This patch contains a prototype of a new widget framework. In this framework, Components can be reused in the tree as many times as the author desires. Also, StatefulComponent is split into two pieces, a ComponentConfiguration and a ComponentState. The ComponentConfiguration is created by the author and can be reused as many times as desired. When mounted into the tree, the ComponentConfiguration creates a ComponentState to hold the state for the component. The state remains in the tree and cannot be reused.
October 2015: fn3 is Flutter
This concludes the fn3 port!
Renamed the project to Flutter
At this point, we have the framework we all know and love today!
… modulo a few massive name cleanups