Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Jank no more doc #870

Merged
merged 17 commits into from
Mar 14, 2018
Merged

Jank no more doc #870

merged 17 commits into from
Mar 14, 2018

Conversation

Sfshaza
Copy link
Contributor

@Sfshaza Sfshaza commented Mar 6, 2018

Previous "jank" branch became very corrupted during the work for Flutter Beta, so I'm starting this new one. In the last couple weeks, there have been changes to the Flutter Inspector, Observatory's timeline view, and the performance overlay UI that have required many updates to this doc. This doc doesn't yet reflect Observatory's new timeline customized for Flutter.

Staged: https://sz-flutter-2.firebaseapp.com/ui-performance/ (NEW location)

@Sfshaza Sfshaza changed the title Jank2 Jank no more doc Mar 6, 2018
@googlebot googlebot added the cla: yes Contributor has signed the Contributor License Agreement label Mar 6, 2018
Copy link
Member

@chinmaygarde chinmaygarde left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comments after an initial pass over the document.

<b> <a id="whats-the-point" class="anchor" href="#whats-the-point" aria-hidden="true"><span class="octicon octicon-link"></span></a>What's the point?</b>

* Profile your app on a physical device.
* Profile your app in profile mode.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Lets add a link to the Flutter Modes document.

faster on simulators than real devices, and some are slower.
* Debug mode enables additional checks (such as asserts) that don’t run
in profile or release builds, and these checks can be expensive.
This is why debug mode is also called "slow mode."
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think we call it "Slow Mode" anymore.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For this first version of the page, while "slow mode" is still in some user's minds, I changed it to "this is why... is sometimes called "slow mode". It can be removed later, when slow mode is really good. Does that sound OK?

Each graph represents the last 300 frames for the following two threads used
in every Flutter app:

* Engine<br>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe a short section on the threading within the Flutter engine is warranted before mentioning the threads the Engine and the Rasterizer runs on.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A great point! Added, but needs your feedback. :)


Generally, each frame should be created and displayed within 16ms
(or 1/60th of a second). A frame exceeding this limit fails to display,
resulting in jank, and a vertical red bar appears in one or both of the graphs.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe underscore that a vertical red bar in either graph is sufficient to indicate a dropped frame.

you'll be using a version that has been customized for Flutter apps.

{% comment %}
I've talked to tooling SWEs who feel we're not ready to document this.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

May I be CC'ed on these conversations please :) I didn't know observatory was changing (and especially the Flutter timeline).

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fair point!!! I learn about these mostly by running the plugins. :)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This work was done last summer + fall, but definitely not well communicated. It should be an incremental improvement over the regular (Dart) timeline view.

When you encounter calls to `saveLayer`, ask yourself these questions:

* Does the app need this effect?
* Can any of these calls be eliminated?
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can I apply the same effect to an individual element instead of a group.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Resolved.


#### Checking for non-cached images

Image I/O, such as passing images from host memory to device memory,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe add a section that mentions the difference between host and device memory. Or just mention IO operation such as reading from the assets store and decompressing the image.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this section misrepresents the purpose of the raster cache. It is only meant to snapshot complex hierarchies so that they are easier to render in subsequent frames. Using the raster cache and image decompression and upload and orthogonal issues.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Excellent feedback. Thx (But please review.)

#### Checking for non-cached images

Image I/O, such as passing images from host memory to device memory,
can be expensive. Where possible, you want to cache images.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead of "Where possible", say "Where absolutely necessary" since a raster cache entry is expensive to construct and resource intensive to keep around.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Generally, I think we should be careful about recommending users put more things into the raster cache.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, I missed that point when we talked. Thanks for clarifying.

In most cases, you want to see checkerboards on static images,
but not on non-static images. If a static image is not cached,
you can cache it by placing it into a
[RepaintBoundary](https://docs.flutter.io/flutter/widgets/RepaintBoundary-class.html)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe a section here that says that the engine may still ignore a repaint boundary if it thinks the image is not complex enough.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

Copy link
Member

@chinmaygarde chinmaygarde left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

More comments!

@@ -1,6 +1,6 @@
---
layout: page
title: Jank No More
title: Improving UI Performance
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"Flutter Performance Profiling" maybe?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

Each graph represents the last 300 frames for the following two threads used
in every Flutter app:
Flutter uses several threads to do its work. You have direct control
over what happens in the UI thread, but no direct access to the other
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"All you Dart code runs on the UI thread. And although you have no direct access to any other thread, your actions on the UI thread have performance consequences on other threads.". Or something like that. "direct control" seemed odd since Dart code doesnt know about threads.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

threads.

1. UI thread<br>
The platform's main thread executes Dart code in the Dart VM.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is incorrect. The platforms main thread is different from the UI thread. The engine spawns a separate UI thread to run Dart code. The platforms main thread is unsurprisingly called the "Platform Thread".

The platform's main thread executes Dart code in the Dart VM.
This thread includes code that you wrote, and code executed by
Flutter's framework on your app's behalf.
Also referred to as Flutter's _engine_, plugins typically run here.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is incorrect. Plugin code runs on the "Platform" thread. Dart code runs on the "UI" thread.

its data but, if this thread is slow, it's a result of something
you've done in the Dart code.
Skia, the graphics library, runs on this thread, which also
handles image I/O. [PENDING: Does it handle image I/O?]
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Image I/O is a very nebulous term and I suggest avoiding its use.

Skia, the graphics library, runs on this thread, which also
handles image I/O. [PENDING: Does it handle image I/O?]

1. I/O thread<br>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I feel like this whole section section can be summarized as follows:

1: Platform Thread: The platforms main thread. Plugin code runs here. (You may add links to UIKit and Android documentation about what they consider their main thread).
2: UI Thread: Runs your Dart code. Generate the layer tree. Don't block this!
3: GPU Thread: Takes layer tree and displays it by talking to the GPU.
4: IO Thread: Performs expensive tasks (mostly IO) that would otherwise block either the UI or GPU threads.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

When you encounter calls to `saveLayer`, ask yourself these questions:

* Does the app need this effect?
* Can any of these calls be eliminated?
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Resolved.

can be expensive. Where possible, you want to cache images.
One of the most expensive operations, from a resource perspective, is
rendering a texture using an image file. First, the compressed image is
fetched from persistent storage (disk, for example).
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Lets not mention a disk. I don't think those have been a thing on a phone :D

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

One of the most expensive operations, from a resource perspective, is
rendering a texture using an image file. First, the compressed image is
fetched from persistent storage (disk, for example).
The image is decompressed into device memory (memory on the GPU). The
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Other way around :) Decompressed into host memory and transferred to device memory. Also, its better to say GPU Memory vs RAM instead of "on the".

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

In other words, image I/O can be expensive.
The cache provides snapshots of complex hierarchies so they are easier to
render in subsequent frames.
_You want to cache images only where absolutely necessary._
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why? Because raster cache entries are expensive to construct and take up loads of GPU memory.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

loaded onto the device.
</aside>

### Compile in profile mode
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Run in profile mode?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done


![IntelliJ Flutter Inspector Window](/images/intellij/visual-debugging.png)<br>

The Flutter Inspector is available in the VS Code, Android Studio,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's not available in VSCode - we do have long terms plans to make it so but nothing as of today.


The Flutter Inspector is available in the VS Code, Android Studio,
and IntelliJ plugins, but its UI may change as it continues to evolve.
The inspector is not currently available from the command line.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is some CLI support for the inspector. Whether we want to explicitly mention it or not is another question. /cc @jacob314


#### Programmatically

You can programmatically enable the PerformanceOverlay widget is by
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

strike is

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done


Observatory provides a statement-level single-stepping debugger for Dart and
Flutter applications. It also supports profiling, examining the heap,
and reporting on code coverage. Observatory's _timeline_ view allows you
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would combine these two sentences to just The Observatory supports features like profiling, examining the heap, and displaying code coverage.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

Select **Flutter: Open Observatory Timeline** from the list that pops up.
If this command isn’t available, make sure that the app is running.
{% comment %}
[PENDING: Can you go to the timeline directly? If so, which command?]
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

/cc @DanTup, we should add an explicit command to link to /#/timeline-dashboard.

Copy link
Contributor

@DanTup DanTup Mar 9, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We have :) That's what Flutter Open Observatory Timeline in the palette (mentioned here) does? Only appears when you're debugging a Flutter app (same as others).

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

At least, that's what it's supposed to do. LMK if anyone thinks it's not working right so we can investigate!


Sometimes a scene results in a layer tree that is easy to construct,
but expensive to render on the GPU thread. When this happens,
the engine graph has no red, but the rasterizer graph shows red.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

a meta comment - are engine and rasterizer the best terms here to use for the user? Perhaps UI thread and GPU thread (from the list of the 4 threads at the start of the doc)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I totally agree, @devoncarew.

but it can slow your app and should be avoided if you don’t need it.
Even if you don’t call `saveLayer` explicitly, implicit calls may happen
on your behalf. You can check whether your scene is using saveLayer with the
[PerformanceOverlayLayer.checkerboardOffscreenLayers](https://docs.flutter.io/flutter/rendering/PerformanceOverlayLayer/checkerboardOffscreenLayers.html)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@chinmaygarde, sounds like this toggle is something we should do a better job of exposing in the tooling?

switch.

{% comment %}
[PENDING: How to do this, either via UI or programmatically. At this point,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@chinmaygarde , same, sounds like this should be exposed through the tooling.

@xster
Copy link
Member

xster commented Mar 12, 2018

Oops, I commented on #804 instead. I think the observatory timeline usage guide from the other PR would be very useful for Posse as well. Is that section stricken out?

@Sfshaza
Copy link
Contributor Author

Sfshaza commented Mar 12, 2018

Yes, @xster, that section is striken out. Since it was written, they've added a customized Flutter timeline view and the tooling engineers felt it was best if we don't document it yet, as it will be rewritten. The doc is definitely less useful without that section.

@Sfshaza
Copy link
Contributor Author

Sfshaza commented Mar 12, 2018

NEW staged location: https://sz-flutter-2.firebaseapp.com/ui-performance/

@devoncarew, @chinmaygarde, @xster, are we OK to push this?

@devoncarew
Copy link
Member

Please change:

The Flutter Inspector is available in the VS Code, Android Studio, and IntelliJ plugins to The Flutter Inspector is available in the Android Studio and IntelliJ plugins

Open Observatory using the line chart icon to Open the timeline view using the line chart icon

then lgtm.

@Sfshaza
Copy link
Contributor Author

Sfshaza commented Mar 12, 2018

Got an LGTM from @devoncarew via email.

@FlutterBot
Copy link

Staging URL Generated At https://flutter-io-deploy-three.firebaseapp.com . Please allow Travis Build to finish to view the URL.

@DanTup
Copy link
Contributor

DanTup commented Mar 12, 2018

I saw a comment from @xster about the section titled "What’s the point?" which I think may be worth looking at - it does look a bit weird:

What’s the point?

  • Profile your app on a physical device.
  • Profile your app in profile mode.
  • Check performance on the slowest device your users might use.
  • Start by enabling the performance overlay.

The bullets don't seem to match the heading - they're not reasons for doing it?

@Sfshaza
Copy link
Contributor Author

Sfshaza commented Mar 12, 2018

@DanTup, @xster, the "what's the point" boxes aren't headings. They are trying to summarize the critical points in that section. Maybe they could be better, but they are not a TOC.

@DanTup
Copy link
Contributor

DanTup commented Mar 13, 2018

@Sfshaza I meant the "What's the point?" heading. It seems like the bulleted list is supposed to answer the question "What's the point?", but doesn't. I think the heading of that list ("What's the point?") is what's confusing rather than the list.

@Sfshaza
Copy link
Contributor Author

Sfshaza commented Mar 14, 2018 via email

@Sfshaza Sfshaza merged commit fe87650 into master Mar 14, 2018
@Sfshaza Sfshaza deleted the jank2 branch March 14, 2018 20:04
ZhangQinglian added a commit to flutter-dev/website that referenced this pull request Apr 12, 2018
* Fix typo in index.md. (flutter#860)

* Update flutter-for-react-native.md (flutter#859)

* Fix typo (flutter#861)

* Update flutter-for-react-native.md (flutter#865)

This sentence read: 'In order to make Row' and then proceeded to show how to arrange things in a column.

* Fix some more typos (flutter#862)

* Update MaterialApp ctor argument mentioned in debugging.md (flutter#863)

Previously `debugging.md` mentioned `debugShowGrid` as an argument for `MaterialApp`'s constructor.
I believe this came from the `stocks` example as `MaterialApp` has `debugShowMateralGrid` not `debugShowGrid`.

* Clarify which devices we do not support (flutter#856)

Fixes flutter/flutter#14437

* Update docs.md

* Use the more stable beta channel for analysis (flutter#872)

This works around flutter/flutter#15293 and flutter/flutter#15301.

* Fix a typo in the class description (flutter#876)

* Cookbook part4 (flutter#869)

* More Recipes for the cookbook on Images, Lists, and Gesture Handling.

* Fix Horizontal List complete example

* Fix Typo in Long Lists recipe

* Next few recipes

* Fix indent (flutter#864)

* Allow linking directly to specific tool and persist across site (flutter#831)

* Allow selection of tab from hash in url

* Add selected tool to url during tab changes

* Persist selected tool in localStorage to follow around site

* Use replaceState to avoid causing history entries if you flip back and forth.

Fixes flutter/flutter#14888.

* Fixes the explin (flutter#875)

* Add hyphens to links in post content (flutter#873)

This avoids extending width of post content if links have long words.

* Update using-packages.md (flutter#867)

* Update using-packages.md

Adding word "Or" to clarify running packages get command can be done from IntelliJ or from Terminal

* Add a forced newline

* Align bridging sidebar titles, and shorten to fit on one line (flutter#855)

* Align bridging sidebar titles, and shorten to fit on one line

* Align Web devs page title with Android and React native ones

* using typo (flutter#879)

* Fix typo (flutter#881)

* Fixed spelling error in getting-started (flutter#878)

* Delete a box design of sentence (flutter#882)

A sentence of "... at the following link ..." of "Problems?" of Step 6, it is only surrounded a box design (by div, pre, and code tags). Other steps, it is a normal design sentence.

* Fixes the clipping issue on Safari for Flutter for RN section. (flutter#886)

* Adds a Flutter for RN md file and a sidebar link

* Image link and style fixes

* Flutter get-started link updated

* Hello world text and preview fixes along with other minor fixes

* Hello world code and preview fixes along with other minor fixes

* Deletes junk flutter for rn files

* Update flutter-for-react-native.md

* Fixes the clipping issue on mobile browsers

* Add cookbook image demos, fix dismissable link (flutter#880)

* Add cookbook image demos, fix dismissable link

* Change Dismissable to Dismissible

* Jank no more doc (flutter#870)

* Stashing

* Stashed.

* A new version of the jank page. (In process)

* New screenshots, and less text about Observatory.

* Incorporating Chinmay's feedback.

* Tweaking

* Tweaking, changing title.

* Incorporating feedback.

* Tweaking

* Tool UI (pics) changed, and incorporating feedback.

* Fixing alt text on images.

* Incorporating Devon's feedback.

* Adding a link to the new performance profiling page.

* Incorporating Wm's feedback.

* Adding more feedback, and placing the doc in the sidenav.

* tweak to the new performance article (flutter#888)

* Remove space breaking a markdown link. (flutter#887)

The extra space character prevents the link from being clickable.

* typo fixes (flutter#890)

* Add a few more recipes and two migrations (flutter#884)

* [Cookbook] Reading, writing data to key-value (shared preferences) (flutter#877)

* Adde key-value section to flutter cookbook

* Fixed spelling errors, grammar. Added better example

* Fixed grammar, changed you and your to we and our

* Fixed text and grammar.

* Added 'the' to few places.

* Update main.dart (flutter#885)

Update to coincide with Update index.md flutter#883 - Added the textDirection property to reflect the API change for text RTL support for text widgets that are not a descendant of MaterialApp.

* Update index.md (flutter#883)

Added the textDirection property to reflect the API change for text RTL support for text widgets that are not a descendant of MaterialApp.

* remove references to deprecated createHttpClient method (flutter#893)

* Fix constructor name of `MyStatefulWidget` (flutter#898)

* Add missing parameter (flutter#891)

* Clarify why Android Studio is needed (flutter#900)

* update (flutter#892)

* Add new SDK archive page (flutter#901)

* Add new SDK archive page

* Fix typos

* Update tabs to support different types/names

This restricts the tab changing to a container but also makes the prefix/storage name dynamic so we don't have to call non-editor tabs editors (eg. OSes).

* Add a table of releases to sdk-archive page

* Show a failure message when loading fails

* Move Master inside tabs

* Fix page jumping to top when showing all

* Change "Mac OS" to "macOS"

The rest of the site is already using macOS.

* Don't request archives when we're not rendering them

* Remove conversion/sort code

No longer required since source data format matches what we converted to.

* A few minor typos (flutter#894)

* Add cupertino picker to widget catalog (flutter#903)

* Replace heart with tile in getting-started (flutter#904)

* Add new recipes for fonts, animations, and drawers (flutter#896)

* Fix Build (flutter#916)

* Make Windows requirments more specific (flutter#917)

* Added example to show RESTful JSON POST (flutter#839)

* De dupe ide steps (flutter#899)

* Remove redundant IDE steps

* Remove unused file

* Remove one more mentioning of IDE steps

* Fix typo (flutter#919)

* Update index.md (flutter#914)

Delete </aside> closing tag that was left.

* Update index.md (flutter#910)

Fix duplicate "the the".

* Fix website build (flutter#922)

* Fix links in "File issue" links

page.path is the filename from the repo, page.url is the url of the resulting page.

Fixes flutter/flutter#15349.

* Update index.md (flutter#924)

* Update index.md

* Update index.md

* Update iOS setup (flutter#918)

Reflect Xcode 9.0 requirement given by flutter doctor

* Fix networking example (flutter#921)

* Update fetch-data.md

Rename `json` variable to `_json`

* Rename _json to responseJson

* Add VS Code to Using-IDE page (flutter#906)

* Add tabs and empty VS Code page

This is on its own page so it can have a toc (our current kramdown tov plugin appears to not support multiple within one page).

* Fix bad IDs for tabs

* Support href-based tabs

If a tab has a data-tab-href then navigate to it. If no tab is found, bail out and don't hide content (this allows us to skip all the storage/hash fragments for href-based tabs).

* Commit all Android Studio content in VS Code page

To make it easier to review the changes made, if required.

* First cut at VS Code IDE page

* Remove ID that link checker doesn't like

This does work, but the checker can't verify it :(

* Tweaks based on @devoncarew's feedback

* Tweaks from review

plus fix for rebasing over latest tab changes that require a container around them.

* site bar -> Side Bar

* Add link to #vscode

Also change exclusion in rakefile to be a regex, seems like "#" was being compared as an exact string.

* Link "command palette" to VS Code docs

* Add docs on sharing assets with the platform

* Remove developer.apple.com links from link checking (flutter#928)

* Remove developer.apple.com links from link checking

To work around flutter/flutter#16268

* Commas for the win

* Change installation to use bundles (flutter#912)

Change Flutter installation to use pre-built installation packages that can simply be extracted for installation.

* Revert previous update of asset section.

* Fix Apple.com links (flutter#931)

* Add docs on sharing assets with the platform (flutter#929)

* Improve the Views section of flutter-for-android (flutter#927)

* Improve the Intents section of flutter-for-android (flutter#932)

* Improve the Views section of flutter-for-android

* Improve Intents section in flutter-for-android

* Improve the Async UI section in flutter-for-android (flutter#933)

* Improve the Project structure and Resources section in flutter-for-android (flutter#934)

* Improve the Async UI section in flutter-for-android

* Improve the Project section in flutter-for-android

* Update version of http in sample code

* adding rake to Gemfile. Rake is used to validate links as described in README's developing step 7 (flutter#930)

* Fix typo (flutter#936)

Fix minor typos in catalog/samples page

* Updating the accessibility info. (flutter#926)

* Facebook Login Package (flutter#895)

Since the https://pub.dartlang.org/packages/flutter_facebook_connect is no longer maintained, updated it with https://pub.dartlang.org/packages/flutter_facebook_login

* Update Learn More link to point to beta 2 post (flutter#943)

* Fix code validation issue (flutter#944)

Currently failing with `child' is deprecated and shouldn't be used at example/text_input_md_1.dart:31:15 • deprecated_member_use`

* Make the formatter happy (flutter#945)

Follow-up to flutter#944

* Cookbook: Background processing, Orientation, and Updates (flutter#920)

* Update key-value recipe

* Add background processing example

* Add orientation recipe

* Update a few stale FAQ entries (flutter#940)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
cla: yes Contributor has signed the Contributor License Agreement
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

8 participants