README.md 4.56 KB
Newer Older
1
# Dartdoc Generation
2

3 4 5 6 7 8 9 10 11 12 13 14 15 16
The Flutter API documentation contains code blocks that help provide
context or a good starting point when learning to use any of Flutter's APIs.

To generate these code blocks, Flutter uses dartdoc tools to turn documentation
in the source code into API documentation, as seen on https://api.flutter.dev/.

## Table of Contents

- [Types of code blocks](#types-of-code-blocks)
  - [Sample tool](#sample-tool)
  - [Snippet tool](#snippet-tool)
- [Skeletons](#skeletons)
- [Test Doc Generation Workflow](#test-doc-generation-workflow)
## Types of code blocks
17

18 19 20 21 22 23
### Sample Tool

![Code sample image](assets/code_sample.png)

The code `sample` tool generates a block containing a description and example
code. Here is an example of the code `sample` tool in use:
24 25

```dart
26 27 28 29 30
/// {@tool sample}
///
/// If the avatar is to have an image, the image should be specified in the
/// [backgroundImage] property:
///
31
/// ```dart
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
/// CircleAvatar(
///   backgroundImage: NetworkImage(userAvatarUrl),
/// )
/// ```
/// {@end-tool}
```

This will generate sample code that can be copied to the clipboard and added
to existing applications.

This uses the skeleton for [sample](config/skeletons/sample.html) snippets.

### Snippet Tool

![Code snippet image](assets/code_snippet.png)

The code `snippet` tool can expand sample code into full Flutter applications.
These sample applications can be directly copied and used to demonstrate the
API's functionality in a sample application:

```dart
/// {@tool snippet --template=stateless_widget_material}
/// This example shows how to make a simple [FloatingActionButton] in a
/// [Scaffold], with a pink [backgroundColor] and a thumbs up [Icon].
56
///
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
/// ```dart
/// Widget build(BuildContext context) {
///   return Scaffold(
///     appBar: AppBar(
///       title: Text('Floating Action Button Sample'),
///     ),
///     body: Center(
///       child: Text('Press the button below!')
///     ),
///     floatingActionButton: FloatingActionButton(
///       onPressed: () {
///         // Add your onPressed code here!
///       },
///       child: Icon(Icons.thumb_up),
///       backgroundColor: Colors.pink,
///     ),
///   );
74
/// }
75
/// ```
76 77 78
/// {@end-tool}
```

79 80
This uses the skeleton for [application](config/skeletons/application.html)
snippets.
81

82
Code `snippets` also allow for quick Flutter app generation using the following command:
83

84 85 86
```bash
flutter create --sample=[directory.File.sampleNumber] [name_of_project_directory]
```
87

88
#### Templates
89 90

In order to support showing an entire app when you click on the right tab of
91
the code snippet UI, we have to be able to insert the `snippet` into the template
92 93 94 95
and instantiate the right parts.

To do this, there is a [config/templates](config/templates) directory that
contains a list of templates. These templates represent an entire app that the
96
`snippet` can be placed into, basically a replacement for `lib/main.dart` in a
97 98
flutter app package.

99 100 101
For more information about how to create, use, or update templates, see
[config/templates/README.md](config/templates/README.md).

102 103
## Skeletons

104 105
A skeleton (in relation to this tool) is an HTML template into which the Dart
code blocks and descriptions are interpolated.
106 107

There is currently one skeleton for
108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
[application](config/skeletons/application.html) `snippets` and one for
[sample](config/skeletons/sample.html) `snippets`, but there could be more.

Skeletons use mustache notation (e.g. `{{code}}`) to mark where components will
be interpolated into the template. It doesn't actually use the mustache
package, since these are simple string substitutions, but it uses the same
syntax.

The code block generation tools process the source input and emit HTML for output,
which dartdoc places back into the documentation. Any options given to the
 `{@tool ...}` directive are passed on verbatim to the tool.

The `snippets` tool renders these examples through a combination of markdown
and HTML using the `{@inject-html}` dartdoc directive.

## Test Doc Generation Workflow

If you are making changes to an existing code block or are creating a new code
block, follow these steps to generate a local copy of the API docs and verify
that your code blocks are showing up correctly:
128

129 130 131 132 133 134 135
1. Make an update to a code block or create a new code block.
2. From the root directory, run `./dev/bots/docs.sh`. This should start
generating a local copy of the API documentation.
3. Once complete, check `./dev/docs/doc` to check your API documentation. The
search bar will not work locally, so open `./dev/docs/doc/index.html` to
navigate through the documentation, or search `./dev/docs/doc/flutter` for your
page of interest.