croupier: Upgrade Flutter to Latest

Interestingly (or unfortunately?), flutter is still at 0.0.21.
What really upgraded were sky_engine and sky_services from 0.0.75 to 0.0.89.

(Mojo/Syncbase/Discovery packages were upgraded to correspond with this
new version of Flutter.)

* flutter tools seems to have lost the "very-verbose" flag.
* All Flex/Row/Column/Block/BlockBody now specify the 'children' "optional"
  parameter.
* Upgraded the card animations implementation since the API changed.
  I replaced the code with an AnimationController and Tween<Point>.
* Shortcut template now points to the new location of the flutter file.
* Also updated the README.

Change-Id: I2245e2519a4b296cdcdfaee72371d66d1c47f426
diff --git a/FLUTTER_VERSION b/FLUTTER_VERSION
new file mode 100644
index 0000000..f2d5799
--- /dev/null
+++ b/FLUTTER_VERSION
@@ -0,0 +1 @@
+1b75de1b164a3c5f668933a7603aa9094c181aae
diff --git a/Makefile b/Makefile
index bc066e0..63bb69c 100644
--- a/Makefile
+++ b/Makefile
@@ -74,7 +74,7 @@
 # Runs a sky app.
 # $1 is location of flx file.
 define RUN_SKY_APP
-	pub run flutter_tools -v --very-verbose run_mojo \
+	pub run flutter_tools -v run_mojo \
 	--app $1 \
 	$(MOJO_ANDROID_FLAGS) \
 	--mojo-path $(MOJO_DIR)/src \
diff --git a/README.md b/README.md
index 9cef7b2..2840b66 100644
--- a/README.md
+++ b/README.md
@@ -26,6 +26,9 @@
 possible that the `pubspec.yaml` file will need to be modified to accomodate
 your installation of Flutter. Instructions are available [here](http://flutter.io/getting-started/).
 
+The last known version of Flutter guaranteed to work with this project is
+present inside the FLUTTER_VERSION file.
+
 ## Dart
 
 Flutter depends on a relatively new version of the Dart SDK. Therefore, please
@@ -85,8 +88,7 @@
 The workaround is to launch Croupier on a single device at a time.
 
 __Note:__ This example currently relies on a mount table on the local network at
-`192.168.86.254:8101`. This may be changed to the global mount table at a later time.
-https://github.com/vanadium/issues/issues/782
+`192.168.86.254:8101`. To avoid this, use the set the `GLOBAL` environment variable to true (see below).
 
 ## Start
 
@@ -99,6 +101,32 @@
 syncbase instance that the others are mounted upon, it is recommended that this
 one is started before the other devices.
 
+# Shortcuts
+
+In order to run the app without being connected to a workstation, you need to
+load a shortcut onto your Android devices.
+```
+ANDROID=1 make shortcut
+```
+
+Note: The command above loads a file that affects how `make start` runs. To
+return to normal development, you should clean up the shortcut file.
+```
+ANDROID=1 make shortcut-remove
+```
+
+# Global Flag
+
+If you want to run the app on the global public mount table (recommended), you
+should set the GLOBAL environment variable to true.
+```
+GLOBAL=true ANDROID=1 make start
+GLOBAL=true ANDROID=1 make shortcut
+```
+
+Using the global mount table can make app performance a little slower, but you
+will not need to run a local mount table at `192.168.86.254:8101`.
+
 ## Deleting Mojo Shell
 
 On your Android device, go to the Apps that you downloaded and Uninstall Mojo
diff --git a/lib/components/board.dart b/lib/components/board.dart
index 4741392..9f6bbfc 100644
--- a/lib/components/board.dart
+++ b/lib/components/board.dart
@@ -179,7 +179,7 @@
     return new Container(
         height: config.height,
         width: config.width,
-        child: new Stack([
+        child: new Stack(children: [
           new Positioned(top: 0.0, left: 0.0, child: boardChild),
           new Positioned(
               top: config.height * (offscreenDelta + 0.5),
@@ -225,7 +225,7 @@
     return new Container(
         height: config.height,
         width: config.width,
-        child: new Stack([
+        child: new Stack(children: [
           new Positioned(
               top: 0.0,
               left: 0.0,
@@ -288,14 +288,16 @@
     return new Container(
         height: config.height,
         width: config.width,
-        child: new Column([
+        child: new Column(
+            children: [
           new Flexible(child: _playerProfile(2, PROFILE_SIZE), flex: 0),
           new Flexible(child: _getPass(2), flex: 0),
           new Flexible(
-              child: new Row([
+              child: new Row(
+                  children: [
                 new Flexible(child: _playerProfile(1, PROFILE_SIZE), flex: 0),
                 new Flexible(child: _getPass(1), flex: 0),
-                new Flexible(child: new Block([]), flex: 1),
+                new Flexible(child: new Block(children: []), flex: 1),
                 new Flexible(child: _getPass(3), flex: 0),
                 new Flexible(child: _playerProfile(3, PROFILE_SIZE), flex: 0)
               ],
@@ -314,14 +316,14 @@
         height: config.height,
         width: config.width,
         child: new Center(
-            child: new Row([
+            child: new Row(children: [
           new Flexible(
               flex: 1,
               child: new Center(
                   child: _buildAvatarSlotCombo(rotateByGamePlayerNumber(1)))),
           new Flexible(
               flex: 1,
-              child: new Column([
+              child: new Column(children: [
                 new Flexible(
                     flex: 1,
                     child: _buildAvatarSlotCombo(rotateByGamePlayerNumber(2))),
@@ -380,7 +382,7 @@
     return new Container(
         width: config.cardWidth,
         height: config.cardHeight,
-        child: new Stack(items));
+        child: new Stack(children: items));
   }
 
   Widget _showTrickText(int pNum) {
@@ -465,11 +467,13 @@
                             ? style.theme.accentColor
                             : style.transparentColor,
                         width: 5.0))),
-            child: new Column([
+            child: new Column(
+                children: [
               new Flexible(child: _playerProfile(2, PROFILE_SIZE), flex: 0),
               new Flexible(child: _showTrickText(2), flex: 0),
               new Flexible(
-                  child: new Row([
+                  child: new Row(
+                      children: [
                     new Flexible(
                         child: _playerProfile(1, PROFILE_SIZE), flex: 0),
                     new Flexible(child: _showTrickText(1), flex: 0),
@@ -494,8 +498,8 @@
 
     double height = config.cardHeight * this._centerScaleFactor;
     double width = config.cardWidth * this._centerScaleFactor;
-    Widget centerPiece =
-        new Container(height: height, width: width, child: new Block([]));
+    Widget centerPiece = new Container(
+        height: height, width: width, child: new Block(children: []));
     if (localAsking == 4) {
       // If all cards played are revealed, show Take Trick button.
       int rotateNum = config.game.determineTrickWinner();
@@ -511,28 +515,32 @@
           rotateNum);
     }
 
-    return new Column([
+    return new Column(
+        children: [
       new Flexible(
-          child: new Row([
-        new Flexible(child: new Block([])),
+          child: new Row(
+              children: [
+        new Flexible(child: new Block(children: [])),
         new Flexible(child: new Center(child: _buildCenterCard(2))),
-        new Flexible(child: new Block([])),
+        new Flexible(child: new Block(children: [])),
       ],
               alignItems: FlexAlignItems.center,
               justifyContent: FlexJustifyContent.center)),
       new Flexible(
-          child: new Row([
+          child: new Row(
+              children: [
         new Flexible(child: new Center(child: _buildCenterCard(1))),
-        new Flexible(child: new Block([centerPiece])),
+        new Flexible(child: new Block(children: [centerPiece])),
         new Flexible(child: new Center(child: _buildCenterCard(3))),
       ],
               alignItems: FlexAlignItems.center,
               justifyContent: FlexJustifyContent.center)),
       new Flexible(
-          child: new Row([
-        new Flexible(child: new Block([])),
+          child: new Row(
+              children: [
+        new Flexible(child: new Block(children: [])),
         new Flexible(child: new Center(child: _buildCenterCard(0))),
-        new Flexible(child: new Block([])),
+        new Flexible(child: new Block(children: [])),
       ],
               alignItems: FlexAlignItems.center,
               justifyContent: FlexJustifyContent.center))
@@ -558,9 +566,9 @@
     List<logic_card.Card> cards =
         game.cardCollections[playerNumber + HeartsGame.OFFSET_PLAY];
 
-    bool hasPlayed = cards.length > 0;
     // TODO(alexfandrianto): Clean up soon.
     // https://github.com/vanadium/issues/issues/1098
+    //bool hasPlayed = cards.length > 0;
     //bool isTurn = game.whoseTurn == playerNumber && !hasPlayed;
 
     double height = config.cardHeight * this._centerScaleFactor;
@@ -599,7 +607,7 @@
     }*/
 
     return new Container(
-        height: height, width: width, child: new Stack(stackWidgets));
+        height: height, width: width, child: new Stack(children: stackWidgets));
   }
 
   // The off-screen cards consist of trick cards and play cards.
diff --git a/lib/components/card.dart b/lib/components/card.dart
index bdd8ae5..92c5ff8 100644
--- a/lib/components/card.dart
+++ b/lib/components/card.dart
@@ -154,7 +154,8 @@
 }
 
 class ZCardState extends widgets.State<ZCard> {
-  ValuePerformance<Point> _performance;
+  Tween<Point> _positionTween;
+  AnimationController _animationController;
   List<
       Point> _pointQueue; // at least 1 longer than the current animation index.
   int _animationIndex;
@@ -173,11 +174,10 @@
       _pointQueue.add(config.startingPosition);
     }
     _pointQueue.add(config.endingPosition);
-    _performance = new ValuePerformance<Point>(
-        variable: new AnimatedValue<Point>(Point.origin, curve: Curves.easeOut),
-        duration: this.animationDuration);
-    _performance.addStatusListener((PerformanceStatus status) {
-      if (status == PerformanceStatus.completed) {
+    _animationController =
+        new AnimationController(duration: this.animationDuration);
+    _animationController.addStatusListener((AnimationStatus status) {
+      if (status == AnimationStatus.completed) {
         _animationIndex++;
         _tryAnimate();
       }
@@ -220,11 +220,9 @@
     if (config.animationType == CardAnimationType.NONE ||
         _pointQueue.length == 1) {
       Point endingLocation = config.endingPosition;
-      _performance.variable
-        ..begin = endingLocation
-        ..value = endingLocation
-        ..end = endingLocation;
-      _performance.progress = 0.0;
+      _positionTween =
+          new Tween<Point>(begin: endingLocation, end: endingLocation);
+      _animationController.value = 0.0;
       _animationIndex = _pointQueue.length - 1;
       return;
     }
@@ -238,21 +236,19 @@
 
   // Return the current animation position of the ZCard.
   Point get localPosition {
-    return _performance.variable.value;
+    return _positionTween.evaluate(_animationController);
   }
 
   void _tryAnimate() {
     // Let animations finish... (Is this a good idea?)
-    if (!_performance.isAnimating && _needsAnimation()) {
+    if (!_animationController.isAnimating && _needsAnimation()) {
       Point startingLocation = _pointQueue[_animationIndex];
       Point endingLocation = _pointQueue[_animationIndex + 1];
-      _performance.variable
-        ..begin = startingLocation
-        ..value = startingLocation
-        ..end = endingLocation;
-      _performance.progress = 0.0;
-      _performance.duration = this.animationDuration;
-      _performance.play();
+      _positionTween =
+          new Tween<Point>(begin: startingLocation, end: endingLocation);
+      _animationController.value = 0.0;
+      _animationController.duration = this.animationDuration;
+      _animationController.play(AnimationDirection.forward);
     }
   }
 
@@ -264,14 +260,13 @@
         alignment: new FractionalOffset(0.5, 0.5));
 
     // Prepare the transition, which is a fixed pixel translation.
-    widgets.Widget retWidget = new widgets.BuilderTransition(
-        variables: <AnimatedValue>[_performance.variable],
-        builder: (widgets.BuildContext c) {
+    widgets.Widget retWidget = new widgets.AnimatedBuilder(
+        animation: _animationController,
+        builder: (widgets.BuildContext c, widgets.Widget child) {
       Matrix4 transform = new Matrix4.identity()
-        ..translate(
-            _performance.variable.value.x, _performance.variable.value.y);
-      return new widgets.Transform(transform: transform, child: image);
-    }, performance: _performance.view);
+        ..translate(localPosition.x, localPosition.y);
+      return new widgets.Transform(transform: transform, child: child);
+    }, child: image);
 
     return retWidget;
   }
diff --git a/lib/components/card_collection.dart b/lib/components/card_collection.dart
index ba31fe3..99994a7 100644
--- a/lib/components/card_collection.dart
+++ b/lib/components/card_collection.dart
@@ -180,7 +180,7 @@
         decoration: new BoxDecoration(backgroundColor: config.backgroundColor),
         height: config.height,
         width: _produceColumnWidth,
-        child: new Stack(draggableKids));
+        child: new Stack(children: draggableKids));
   }
 
   double get _produceRowHeight => config.heightCard + CARD_MARGIN * 2;
@@ -217,7 +217,7 @@
         decoration: new BoxDecoration(backgroundColor: config.backgroundColor),
         height: _produceRowHeight,
         width: config.width,
-        child: new Stack(draggableKids));
+        child: new Stack(children: draggableKids));
   }
 
   Widget _produceSingle(List<component_card.Card> cardWidgets) {
@@ -230,7 +230,7 @@
         decoration: new BoxDecoration(backgroundColor: config.backgroundColor),
         height: _produceRowHeight,
         width: _produceColumnWidth,
-        child: new Stack(draggableKids));
+        child: new Stack(children: draggableKids));
   }
 
   double get _whiteLineHeight => WHITE_LINE_HEIGHT;
@@ -276,7 +276,7 @@
         }
         return new Container(
             decoration: new BoxDecoration(backgroundColor: Colors.white),
-            child: new Stack(<Widget>[
+            child: new Stack(children: <Widget>[
               new Positioned(
                   top: 2 * _produceRowHeight + 2 * _whiteLineHeight,
                   child: _produceRow(ss,
diff --git a/lib/components/croupier.dart b/lib/components/croupier.dart
index 910e776..e4476d7 100644
--- a/lib/components/croupier.dart
+++ b/lib/components/croupier.dart
@@ -44,7 +44,7 @@
         // in which we show them a UI to start a new game, join a game, or change some settings.
         return new Container(
             padding: new EdgeDims.only(top: ui.window.padding.top),
-            child: new Column([
+            child: new Column(children: [
               new FlatButton(
                   child: new Text('Create Game', style: style.Text.titleStyle),
                   onPressed: makeSetStateCallback(
@@ -69,7 +69,7 @@
         // in which we let them pick a game out of the many possible games... There aren't that many.
         return new Container(
             padding: new EdgeDims.only(top: ui.window.padding.top),
-            child: new Flex([
+            child: new Column(children: [
               new FlatButton(
                   child: new Text('Proto', style: style.Text.titleStyle),
                   onPressed: makeSetStateCallback(
@@ -91,7 +91,7 @@
                   child: new Text('Back', style: style.Text.subtitleStyle),
                   onPressed: makeSetStateCallback(
                       logic_croupier.CroupierState.Welcome))
-            ], direction: FlexDirection.vertical));
+            ]));
       case logic_croupier.CroupierState.JoinGame:
         // A stateful view, showing the game ads discovered.
         List<Widget> gameAdWidgets = new List<Widget>();
@@ -120,7 +120,7 @@
         // in which players wait for game invitations to arrive.
         return new Container(
             padding: new EdgeDims.only(top: ui.window.padding.top),
-            child: new Column(gameAdWidgets));
+            child: new Column(children: gameAdWidgets));
       case logic_croupier.CroupierState.ArrangePlayers:
         return new Container(
             padding: new EdgeDims.only(top: ui.window.padding.top),
@@ -174,11 +174,11 @@
 
     if (needsArrangement) {
       return new ScrollableViewport(
-          child: new Row(profileWidgets),
-          scrollDirection: ScrollDirection.horizontal);
+          child: new Row(children: profileWidgets),
+          scrollDirection: Axis.horizontal);
     }
-    return new MaxTileWidthGrid(profileWidgets,
-        maxTileWidth: style.Size.settingsWidth);
+    return new MaxTileWidthGrid(
+        children: profileWidgets, maxTileWidth: style.Size.settingsWidth);
   }
 
   Widget _buildArrangePlayers() {
@@ -189,7 +189,7 @@
 
     allWidgets.add(new Flexible(
         flex: 0,
-        child: new Row([
+        child: new Row(children: [
           new Text("${config.croupier.game.gameTypeName}",
               style: style.Text.hugeStyle)
         ], justifyContent: FlexJustifyContent.spaceAround)));
@@ -225,7 +225,7 @@
     if (config.croupier.game.isCreator) {
       allWidgets.add(new Flexible(
           flex: 0,
-          child: new Row([
+          child: new Row(children: [
             new FlatButton(
                 child: new Text("Start Game", style: style.Text.hugeStyle),
                 onPressed: startCb,
@@ -239,6 +239,6 @@
             onPressed:
                 makeSetStateCallback(logic_croupier.CroupierState.Welcome))));
 
-    return new Column(allWidgets);
+    return new Column(children: allWidgets);
   }
 }
diff --git a/lib/components/croupier_game_advertisement.dart b/lib/components/croupier_game_advertisement.dart
index 07a960c..fb7fcac 100644
--- a/lib/components/croupier_game_advertisement.dart
+++ b/lib/components/croupier_game_advertisement.dart
@@ -23,7 +23,7 @@
   Widget build(BuildContext context) {
     return new GestureDetector(
         child: new Card(
-            child: new Row([
+            child: new Row(children: [
           new Card(
               child: new CroupierProfileComponent(
                   settings: settings,
diff --git a/lib/components/croupier_profile.dart b/lib/components/croupier_profile.dart
index b406546..9f079a4 100644
--- a/lib/components/croupier_profile.dart
+++ b/lib/components/croupier_profile.dart
@@ -56,7 +56,7 @@
             padding: const EdgeDims.all(padAmount),
             child: new Card(
                 color: new Color(settings.color),
-                child: new Column([
+                child: new Column(children: [
                   new AssetImage(
                       name: CroupierSettings.makeAvatarUrl(settings.avatar)),
                   new Text(settings.name, style: style.Text.largeStyle)
@@ -68,7 +68,7 @@
             padding: const EdgeDims.all(padAmount),
             child: new Card(
                 color: new Color(settings.color),
-                child: new Row([
+                child: new Row(children: [
                   new AssetImage(
                       name: CroupierSettings.makeAvatarUrl(settings.avatar),
                       fit: ImageFit.scaleDown)
@@ -78,7 +78,7 @@
             color: new Color(settings.color),
             child: new Container(
                 padding: const EdgeDims.all(padAmount),
-                child: new Row([
+                child: new Row(children: [
                   new AssetImage(
                       name: CroupierSettings.makeAvatarUrl(settings.avatar),
                       fit: ImageFit.scaleDown),
@@ -89,9 +89,9 @@
             color: new Color(settings.color),
             child: new Container(
                 padding: const EdgeDims.all(padAmount),
-                child: new Row(
-                    [new Text(settings.name, style: style.Text.largeStyle)],
-                    justifyContent: FlexJustifyContent.collapse)));
+                child: new Row(children: [
+                  new Text(settings.name, style: style.Text.largeStyle)
+                ], justifyContent: FlexJustifyContent.collapse)));
     }
   }
 }
diff --git a/lib/components/croupier_settings.dart b/lib/components/croupier_settings.dart
index b169bec..7779e39 100644
--- a/lib/components/croupier_settings.dart
+++ b/lib/components/croupier_settings.dart
@@ -88,14 +88,14 @@
         new AssetImage(
             name: CroupierSettings.makeAvatarUrl(config.settings.avatar))));
 
-    return new Column(w);
+    return new Column(children: w);
   }
 
   Widget _makeButtonRow(String type, Widget child) {
     String capType = _capitalize(type);
     return new FlatButton(
         onPressed: () => _handlePressed(type),
-        child: new Row([
+        child: new Row(children: [
           new Flexible(
               flex: 1,
               child: new Text(capType, style: Theme.of(context).text.subhead)),
@@ -114,9 +114,9 @@
             title: new Text(capType),
             content: new Input(
                 key: globalKeys[type],
-                placeholder: capType,
+                hintText: capType,
                 initialValue: config.settings.getStringValue(type),
-                keyboardType: KeyboardType.TEXT,
+                keyboardType: KeyboardType.text,
                 onChanged: _makeHandleChanged(type)),
             actions: [
               new FlatButton(child: new Text('CANCEL'), onPressed: () {
@@ -150,7 +150,8 @@
 
         dialog = new Dialog(
             title: new Text(capType),
-            content: new MaxTileWidthGrid(flexColors, maxTileWidth: 75.0),
+            content:
+                new MaxTileWidthGrid(children: flexColors, maxTileWidth: 75.0),
             actions: [
               new FlatButton(child: new Text('CANCEL'), onPressed: () {
                 Navigator.pop(context);
@@ -168,7 +169,8 @@
 
         dialog = new Dialog(
             title: new Text(capType),
-            content: new MaxTileWidthGrid(flexAvatars, maxTileWidth: 75.0),
+            content:
+                new MaxTileWidthGrid(children: flexAvatars, maxTileWidth: 75.0),
             actions: [
               new FlatButton(child: new Text('CANCEL'), onPressed: () {
                 Navigator.pop(context);
diff --git a/lib/components/game.dart b/lib/components/game.dart
index 591c92e..9f2c5a9 100644
--- a/lib/components/game.dart
+++ b/lib/components/game.dart
@@ -198,7 +198,7 @@
         child: new Container(
             width: config.width,
             height: config.height,
-            child: new Stack(positionedCards)));
+            child: new Stack(children: positionedCards)));
   }
 }
 
diff --git a/lib/components/hearts/hearts.part.dart b/lib/components/hearts/hearts.part.dart
index 0f787eb..1ddd970 100644
--- a/lib/components/hearts/hearts.part.dart
+++ b/lib/components/hearts/hearts.part.dart
@@ -143,7 +143,9 @@
     children.add(this.buildCardAnimationLayer(visibleCardCollectionIndexes));
 
     return new Container(
-        width: config.width, height: config.height, child: new Stack(children));
+        width: config.width,
+        height: config.height,
+        child: new Stack(children: children));
   }
 
   void _switchViewCallback() {
@@ -305,11 +307,11 @@
 
   Widget _makeDebugButtons() {
     if (config.game.debugMode == false) {
-      return new Row([
+      return new Row(children: [
         new Flexible(flex: 4, child: _makeButton('Quit', _quitGameCallback))
       ]);
     }
-    return new Row([
+    return new Row(children: [
       new Flexible(flex: 1, child: new Text('P${config.game.playerNumber}')),
       new Flexible(
           flex: 5, child: _makeButton('Switch Player', _switchPlayersCallback)),
@@ -373,7 +375,8 @@
         return null;
     }
     kids.add(_makeDebugButtons());
-    return new Column(kids, justifyContent: FlexJustifyContent.spaceBetween);
+    return new Column(
+        children: kids, justifyContent: FlexJustifyContent.spaceBetween);
   }
 
   Widget showBoard() {
@@ -529,7 +532,8 @@
     return new Container(
         padding: new EdgeDims.all(10.0),
         decoration: decoration,
-        child: new Row(statusBarWidgets,
+        child: new Row(
+            children: statusBarWidgets,
             justifyContent: FlexJustifyContent.spaceBetween));
   }
 
@@ -562,7 +566,8 @@
     if (_showSplitView) {
       cardCollections.add(new Container(
           decoration: style.Box.background,
-          child: new Column([_buildFullMiniBoard(), _buildStatusBar()])));
+          child: new Column(
+              children: [_buildFullMiniBoard(), _buildStatusBar()])));
     } else {
       Widget playArea = new Container(
           decoration: new BoxDecoration(backgroundColor: Colors.teal[500]),
@@ -583,7 +588,7 @@
 
       cardCollections.add(new Container(
           decoration: style.Box.background,
-          child: new BlockBody([_buildStatusBar(), playArea])));
+          child: new BlockBody(children: [_buildStatusBar(), playArea])));
     }
 
     List<logic_card.Card> cards = game.cardCollections[p];
@@ -609,9 +614,10 @@
         comparator: _compareCards,
         width: config.width,
         useKeys: true);
-    cardCollections.add(new BlockBody([c, _makeDebugButtons()]));
+    cardCollections.add(new BlockBody(children: [c, _makeDebugButtons()]));
 
-    return new Column(cardCollections,
+    return new Column(
+        children: cardCollections,
         justifyContent: FlexJustifyContent.spaceBetween);
   }
 
@@ -638,7 +644,7 @@
 
     List<Widget> scores = new List<Widget>();
     scores.add(new Flexible(
-        child: new Flex([
+        child: new Flex(children: [
           new Flexible(
               child: new Center(child: new Text("Score:", style: bigStyle)),
               flex: 1),
@@ -659,7 +665,7 @@
       TextStyle scoreStyle = isMaxOverall ? bigRedStyle : bigStyle;
 
       scores.add(new Flexible(
-          child: new Flex([
+          child: new Flex(children: [
             new Flexible(
                 child: new CroupierProfileComponent(
                     settings: config.croupier.settingsFromPlayerNumber(i)),
@@ -676,8 +682,9 @@
           ], direction: crossDirection, alignItems: FlexAlignItems.stretch),
           flex: 2));
     }
-    return new Column([
-      new Flexible(child: new Flex(scores, direction: mainDirection), flex: 7),
+    return new Column(children: [
+      new Flexible(
+          child: new Flex(children: scores, direction: mainDirection), flex: 7),
       new Flexible(child: w, flex: 1),
       new Flexible(child: _makeDebugButtons(), flex: 1)
     ]);
@@ -686,7 +693,7 @@
   Widget showDeal() {
     return new Container(
         decoration: new BoxDecoration(backgroundColor: Colors.pink[500]),
-        child: new Column([
+        child: new Column(children: [
           new Text('Player ${config.game.playerNumber}'),
           new Text('Waiting for Deal...'),
           _makeDebugButtons()
@@ -719,9 +726,10 @@
         decoration: new BoxDecoration(backgroundColor: bgColor),
         padding: new EdgeDims.all(10.0),
         width: config.width,
-        child: new Row(topCardWidgets,
+        child: new Row(
+            children: topCardWidgets,
             justifyContent: FlexJustifyContent.spaceBetween));
-    Widget combinedTopArea = new BlockBody([statusBar, topArea]);
+    Widget combinedTopArea = new BlockBody(children: [statusBar, topArea]);
 
     List<logic_card.Card> emptyC;
     if (c1.length == 0) {
@@ -745,9 +753,11 @@
         altColor: Colors.grey[700],
         useKeys: true);
 
-    Widget combinedBottomArea = new BlockBody([handArea, _makeDebugButtons()]);
+    Widget combinedBottomArea =
+        new BlockBody(children: [handArea, _makeDebugButtons()]);
 
-    return new Column(<Widget>[combinedTopArea, combinedBottomArea],
+    return new Column(
+        children: <Widget>[combinedTopArea, combinedBottomArea],
         justifyContent: FlexJustifyContent.spaceBetween);
   }
 
@@ -859,10 +869,10 @@
         decoration: style.Box.liveNow,
         height: config.height,
         width: config.width,
-        child: new Column([
+        child: new Column(children: [
           new Text("Play Hearts as a...", style: style.Text.hugeStyle),
           new FlatButton(
-              child: new Row([
+              child: new Row(children: [
                 new Icon(size: IconSize.s48, icon: personIcon),
                 new Text("Player", style: style.Text.largeStyle)
               ], justifyContent: FlexJustifyContent.collapse),
@@ -872,7 +882,7 @@
             });
           }),
           new FlatButton(
-              child: new Row([
+              child: new Row(children: [
                 new Icon(size: IconSize.s48, icon: tableIcon),
                 new Text("Table", style: style.Text.largeStyle)
               ], justifyContent: FlexJustifyContent.collapse),
@@ -930,14 +940,14 @@
         })
       ];
     }
-    Widget firstChild =
-        new Row(children, justifyContent: FlexJustifyContent.collapse);
+    Widget firstChild = new Row(
+        children: children, justifyContent: FlexJustifyContent.collapse);
 
     return new Container(
         decoration: style.Box.liveNow,
         height: config.height,
         width: config.width,
-        child: new Column([
+        child: new Column(children: [
           firstChild,
           new Flexible(child: _buildArrangeTable(activeID: arrangeID))
         ], alignItems: FlexAlignItems.center));
@@ -961,7 +971,8 @@
         decoration: style.Box.liveNow,
         height: config.height,
         width: config.width,
-        child: new Column(children, alignItems: FlexAlignItems.center));
+        child:
+            new Column(children: children, alignItems: FlexAlignItems.center));
   }
 
   Widget _buildFallbackArrangePlayers() {
@@ -976,10 +987,12 @@
     int numAtTable = config.croupier.players_found.values
         .where((int playerNumber) => playerNumber == 4)
         .length;
-    return new Column([
+    return new Column(
+        children: [
       new Flexible(
           flex: 1,
-          child: new Row([
+          child: new Row(
+              children: [
             _buildEmptySlot(),
             _buildSlot(personIcon, 2, activeID, canDragTo),
             _buildEmptySlot()
@@ -988,7 +1001,8 @@
               alignItems: FlexAlignItems.stretch)),
       new Flexible(
           flex: 1,
-          child: new Row([
+          child: new Row(
+              children: [
             _buildSlot(personIcon, 1, activeID, canDragTo),
             _buildSlot(tableIcon, 4, activeID, canDragTo,
                 extra: "x${numAtTable}"),
@@ -998,7 +1012,8 @@
               alignItems: FlexAlignItems.stretch)),
       new Flexible(
           flex: 1,
-          child: new Row([
+          child: new Row(
+              children: [
             _buildEmptySlot(),
             _buildSlot(personIcon, 0, activeID, canDragTo),
             _buildEmptySlot()
@@ -1016,7 +1031,8 @@
 
   Widget _buildSlot(String name, int index, int activeID, bool canDragTo,
       {String extra: ""}) {
-    Widget slotWidget = new Row([
+    Widget slotWidget = new Row(
+        children: [
       new Icon(size: IconSize.s48, icon: name),
       new Text(extra, style: style.Text.largeStyle)
     ],
diff --git a/lib/components/main_route.dart b/lib/components/main_route.dart
index 2c4887f..4eb733a 100644
--- a/lib/components/main_route.dart
+++ b/lib/components/main_route.dart
@@ -56,9 +56,9 @@
 
   // TODO(alexfandrianto): Can we do better than this?
   Widget _buildSplashScreen() {
-    var stack = new Stack([
+    var stack = new Stack(children: [
       new AssetImage(name: 'images/splash/background.png', fit: ImageFit.cover),
-      new Row([
+      new Row(children: [
         new AssetImage(
             name: 'images/splash/flutter.png', width: style.Size.splashLogo),
         new AssetImage(
@@ -66,7 +66,8 @@
       ], justifyContent: FlexJustifyContent.center),
       new Container(
           child: new Row(
-              [new Text('Loading Croupier...', style: style.Text.splash)],
+              children:
+                  [new Text('Loading Croupier...', style: style.Text.splash)],
               alignItems: FlexAlignItems.end,
               justifyContent: FlexJustifyContent.center),
           padding: style.Spacing.normalPadding)
@@ -76,9 +77,9 @@
 
   Widget _buildDrawer() {
     return new Drawer(
-        child: new Block(<Widget>[
+        child: new Block(children: <Widget>[
       new DrawerHeader(
-          child: new BlockBody([
+          child: new BlockBody(children: [
         new CroupierProfileComponent(
             settings: config.croupier.settings,
             width: style.Size.settingsWidth,
@@ -95,7 +96,7 @@
           child: new Text('Settings')),
       new DrawerItem(
           icon: 'action/build',
-          child: new Row([
+          child: new Row(children: [
             new Text('Debug Mode'),
             new Switch(
                 value: config.croupier.debugMode, onChanged: _handleDebugMode)
diff --git a/lib/components/proto/proto.part.dart b/lib/components/proto/proto.part.dart
index b9fb48f..5f39248 100644
--- a/lib/components/proto/proto.part.dart
+++ b/lib/components/proto/proto.part.dart
@@ -44,7 +44,7 @@
 
     return new Container(
         decoration: new BoxDecoration(backgroundColor: Colors.pink[500]),
-        child: new Column(cardCollections));
+        child: new Column(children: cardCollections));
   }
 
   void _makeGameMoveCallback(logic_card.Card card, List<logic_card.Card> dest) {
@@ -60,11 +60,11 @@
 
   Widget _makeDebugButtons() {
     if (config.game.debugMode == false) {
-      return new Row([
+      return new Row(children: [
         new Flexible(flex: 4, child: _makeButton('Quit', _quitGameCallback))
       ]);
     }
-    return new Row([
+    return new Row(children: [
       new Text('P${config.game.playerNumber}'),
       _makeButton('Switch View', _switchPlayersCallback),
       _makeButton('Quit', _quitGameCallback)
diff --git a/lib/components/solitaire/solitaire.part.dart b/lib/components/solitaire/solitaire.part.dart
index 4ede22e..83ad4ef 100644
--- a/lib/components/solitaire/solitaire.part.dart
+++ b/lib/components/solitaire/solitaire.part.dart
@@ -39,7 +39,9 @@
     }
 
     return new Container(
-        width: config.width, height: config.height, child: new Stack(children));
+        width: config.width,
+        height: config.height,
+        child: new Stack(children: children));
   }
 
   void _cheatCallback() {
@@ -58,11 +60,11 @@
 
   Widget _makeDebugButtons() {
     if (config.game.debugMode == false) {
-      return new Row([
+      return new Row(children: [
         new Flexible(flex: 4, child: _makeButton('Quit', _quitGameCallback))
       ]);
     }
-    return new Row([
+    return new Row(children: [
       new Flexible(flex: 1, child: new Text('P${config.game.playerNumber}')),
       new Flexible(flex: 5, child: _makeButton('Cheat', _cheatCallback)),
       new Flexible(
@@ -139,9 +141,9 @@
           acceptType: DropType.card,
           useKeys: true);
     }).toList();
-    row1.add(new Row(aces));
+    row1.add(new Row(children: aces));
 
-    row1.add(new Row([
+    row1.add(new Row(children: [
       new CardCollectionComponent(
           game.cardCollections[SolitaireGame.OFFSET_DISCARD],
           true,
@@ -190,10 +192,10 @@
           useKeys: true));
     }
 
-    return new Column([
-      new Row(row1, justifyContent: FlexJustifyContent.spaceBetween),
-      new Row(row2, justifyContent: FlexJustifyContent.spaceBetween),
-      new Row(row3, justifyContent: FlexJustifyContent.spaceBetween),
+    return new Column(children: [
+      new Row(children: row1, justifyContent: FlexJustifyContent.spaceBetween),
+      new Row(children: row2, justifyContent: FlexJustifyContent.spaceBetween),
+      new Row(children: row3, justifyContent: FlexJustifyContent.spaceBetween),
       _makeDebugButtons()
     ]);
   }
@@ -203,7 +205,7 @@
 
     return new Container(
         decoration: new BoxDecoration(backgroundColor: Colors.pink[500]),
-        child: new Column([
+        child: new Column(children: [
           new Text('Player ${game.playerNumber}'),
           _makeButton("Return to Lobby", _quitGameCallback),
           _makeDebugButtons()
@@ -215,7 +217,7 @@
 
     return new Container(
         decoration: new BoxDecoration(backgroundColor: Colors.pink[500]),
-        child: new Column([
+        child: new Column(children: [
           new Text('Player ${game.playerNumber}'),
           _makeButton('Deal', game.dealCardsUI),
           _makeDebugButtons()
diff --git a/pubspec.lock b/pubspec.lock
index 0be2f9c..6f073aa 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -146,23 +146,23 @@
   mojo:
     description: mojo
     source: hosted
-    version: "0.4.8"
+    version: "0.4.12"
   mojo_apptest:
     description: mojo_apptest
     source: hosted
-    version: "0.2.12"
+    version: "0.2.16"
   mojo_sdk:
     description: mojo_sdk
     source: hosted
-    version: "0.2.7"
+    version: "0.2.11"
   mojo_services:
     description: mojo_services
     source: hosted
-    version: "0.4.10"
+    version: "0.4.14"
   mojom:
     description: mojom
     source: hosted
-    version: "0.2.12"
+    version: "0.2.16"
   mustache4dart:
     description: mustache4dart
     source: hosted
@@ -208,7 +208,7 @@
   shelf:
     description: shelf
     source: hosted
-    version: "0.6.4+3"
+    version: "0.6.5"
   shelf_static:
     description: shelf_static
     source: hosted
@@ -220,11 +220,11 @@
   sky_engine:
     description: sky_engine
     source: hosted
-    version: "0.0.75"
+    version: "0.0.89"
   sky_services:
     description: sky_services
     source: hosted
-    version: "0.0.75"
+    version: "0.0.89"
   source_map_stack_trace:
     description: source_map_stack_trace
     source: hosted
@@ -241,6 +241,10 @@
     description: stack_trace
     source: hosted
     version: "1.6.0"
+  stream_channel:
+    description: stream_channel
+    source: hosted
+    version: "1.0.1"
   string_scanner:
     description: string_scanner
     source: hosted
@@ -248,7 +252,7 @@
   syncbase:
     description: syncbase
     source: hosted
-    version: "0.0.27"
+    version: "0.0.28"
   test:
     description: test
     source: hosted
@@ -264,7 +268,7 @@
   v23discovery:
     description: v23discovery
     source: hosted
-    version: "0.0.11"
+    version: "0.0.12"
   vector_math:
     description: vector_math
     source: hosted
diff --git a/shortcut_template b/shortcut_template
index cb90797..37145a1 100644
--- a/shortcut_template
+++ b/shortcut_template
@@ -1,4 +1,4 @@
---map-origin=http://flutter/=https://storage.googleapis.com/mojo/flutter/90ef9fa39c36f4027b82e62262e5c0c43a0466a1/android-arm/
+--map-origin=http://flutter/=https://storage.googleapis.com/mojo/flutter/9ee9721b1b0379da1dae7ed27243da7635d55a3a/android-arm/
 --url-mappings=mojo:flutter=http://flutter/flutter.mojo,mojo:media_service=https://mojo3.v.io/media_service.mojo
 --map-origin=https://mojo3.v.io=https://storage.googleapis.com/mojo_services/
 --debug